JavaRush /Java Blog /Random-TW /喝咖啡休息#156。如何在 Java 中使用 Arrays.binarySearch() 方法

喝咖啡休息#156。如何在 Java 中使用 Arrays.binarySearch() 方法

在 Random-TW 群組發布
來源:FreeCodeCamp 透過本文,您將學習如何在 Java 中使用 Arrays.binarySearch() 方法。 喝咖啡休息#156。 如何在 Java 中使用 Arrays.binarySearch() 方法 - 1

Java 中的 Arrays.binarySearch() 是什麼?

Arrays.binarySearch()方法的官方文件指出:
  • 此方法使用二分搜尋演算法在指定的位元組數組中搜尋指定的值。
  • 在呼叫之前必須對陣列進行排序(使用sort(byte[])方法)。如果不排序,則結果無法確定。
  • 如果陣列包含多個具有指定值的元素,則無法保證會找到哪一個。
簡單來說,Arrays.binarySearch()方法可以在排序數組中搜尋給定元素,如果找到則傳回其索引。
import java.util.Arrays;

public class Main {

	public static void main(String[] args) {
		char vowels[] = {'a', 'e', 'i', 'o', 'u'};

		char key = 'i';

		int foundItemIndex = Arrays.binarySearch(vowels, key);

		System.out.println("The given vowel is at index: " + foundItemIndex);

	}
}
Arrays.binarySearch() 方法將要搜尋的陣列作為第一個參數,將要搜尋的鍵作為第二個參數。上述程式的輸出將是:
給定的母音位於索引:2
請記住,該方法會傳回找到的元素的索引,而不是元素本身。透過這種方式,您可以將索引儲存為整數,就像本例中使用的那樣。預設情況下,此方法使用陣列的第一個索引作為搜尋的起點,使用陣列的長度作為搜尋的終點。在本例中,起始索引為 0,結束索引為 6。您可以自行定義它們,而不是使用預設的起始索引和結束索引。例如,如果要從索引 2 搜尋到索引 4,可以這樣做:
import java.util.Arrays;

public class Main {

	public static void main(String[] args) {
		char vowels[] = {'a', 'e', 'i', 'o', 'u'};

		char key = 'i';
		int startIndex = 2;
		int endIndex = 4;

		int foundItemIndex = Arrays.binarySearch(vowels, startIndex, endIndex, key);

		System.out.println("The given vowel is at index: " + foundItemIndex);

	}
}
在本例中,Arrays.binarySearch()方法將要搜尋的陣列作為第一個參數,起始索引作為第二個參數,結束索引作為第三個參數,鍵作為第四個參數。只要將結束索引保持在數組的長度內,該方法就應該可以正常工作。但如果超過它,就會得到Array index out of range異常。這很簡單,對吧?如果找到該元素,則該方法將傳回該元素的索引。但是如果找不到給定的元素會發生什麼?

當 Arrays.binarySearch() 找不到給定元素時會發生什麼?

讓我們再看一下Arrays.binarySearch()方法的官方文件
  • 如果某個鍵包含在指定範圍內的陣列中,則該方法會尋找該鍵在搜尋結果中的索引;否則我們得到(-(插入點) - 1)
  • 插入點定義為將鍵插入陣列的點:範圍中第一個元素的索引大於鍵,如果範圍中的所有元素都小於鍵,則為 toIndex(結束索引)指定的鍵。
  • 請注意,只有找到 key 時,傳回值才會大於或等於 0。
不是很清楚,對吧?第一行指出,如果在陣列中找到該鍵,則該方法將從搜尋中傳回該鍵的索引。如果未找到,則輸出將等於值(-(插入點) - 1)。根據搜尋鍵的不同,插入點可以有不同的意義。假設我們有一個陣列[5, 6, 7, 8, 9, 10]和搜尋鍵0,這顯然不在陣列中。在這種情況下,搜尋鍵小於數組的所有元素。但大於搜尋鍵的第一個元素是5。因此,在我們的例子中,插入點將是:
(-(第一個大於搜尋關鍵字的元素的索引) - 1) = (0 - 1) = -1
您可以在如下程式碼片段中實現此功能:
package arrays;

import java.util.Arrays;

public class Main {

	public static void main(String[] args) {
		int numbers[] = {5, 6, 7, 8, 9, 10};

		System.out.println(Arrays.binarySearch(numbers, 0)); // -1
	}
}
我們再次假設我們有一個陣列[5, 6, 7, 8, 9, 10]和搜尋鍵12,它顯然不在陣列中。在這種情況下,搜尋鍵大於陣列的所有元素。這裡的插入點將是這樣的:
(-(結束索引 (-(6) - 1) = (-6 - 1) = -7
請記住,如果您不手動指定結束索引,則該方法將使用陣列的長度作為結束索引,在本例中為6。您可以在如下程式碼片段中實現此功能:
import java.util.Arrays;

public class Main {

	public static void main(String[] args) {
		int numbers[] = {5, 6, 7, 8, 9, 10};

		System.out.println(Arrays.binarySearch(numbers, 12)); // -7
	}
}
但是,如果您手動定義開始和結束索引,結果將會改變:
import java.util.Arrays;

public class Main {

	public static void main(String[] args) {
		int numbers[] = {5, 6, 7, 8, 9, 10};

		int startIndex = 1;
		int endIndex = 3;

		System.out.println(Arrays.binarySearch(numbers, startIndex, endIndex, 5)); // -2
		System.out.println(Arrays.binarySearch(numbers, startIndex, endIndex, 10)); // -4

	}
}
嘗試自己計算這些值。您也可以使用帶有以下符號的 Arrays.binarySearch()方法:
import java.util.Arrays;

public class Main {

	public static void main(String[] args) {
		char vowels[] = {'a', 'e', 'i', 'o', 'u'};

		char key = 'i';
		int startIndex = 2;
		int endIndex = 4;

		System.out.println(Arrays.binarySearch(vowels, startIndex, endIndex, key));

	}
}
如果未找到指定的搜尋關鍵字,則適用相同的原則。但是,當比較數組中的字元和給定的搜尋鍵時,將使用對應字元的 ASCII 代碼。也就是說,A (65)將小於a (97)。在交叉檢查程式的輸出時請考慮這一點。
留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION