使用Arrays.binarySearch()を決定する方法
サンプルコード:
public static void main(String[] args) {
int[] array = {1, 3, 4, 2, 5, 6, 0};
System.out.println("排序前:" + Arrays.toString(array));
Arrays.sort(array);
System.out.println("排序后:" + Arrays.toString(array));
System.out.println(Arrays.binarySearch(array, 0));
}
:結果は以下の通りである
戻る値0が配列中に存在することを示す指標値0を検索します。
なぜここにソートすると、その後Arrays.binarySearch()メソッドを呼び出し
ソートではありませんサンプルコードを見てみましょう:
public static void main(String[] args) {
int[] array = {1, 3, 4, 2, 5, 6, 0};
System.out.println("排序前:" + Arrays.toString(array));
System.out.println("排序后:" + Arrays.toString(array));
System.out.println(Arrays.binarySearch(array, 0));
}
出力:
そこ配列0ですが、戻り値は-1、この値に代わって検索していない、と予想される結果と一致していないことをここにあなたが見ることができる、それは明らかです。
ルックArrays.binarySearch()のソースコードを分析:
public static int binarySearch(int[] a, int key) {
//真正调用的还是binarySearch0()方法
return binarySearch0(a, 0, a.length, key);
}
private static int binarySearch0(int[] a, int fromIndex, int toIndex,
int key) {
//fromIndex默认传参就是0,所以low=0
int low = fromIndex;
//toIndex是数组的长度7,所以high=6
int high = toIndex - 1;
//循环判断
while (low <= high) {
//无符号右移1位,其实就是(low + high)/2,只是用移位运算更快
int mid = (low + high) >>> 1;
//取得中间下标mid的数值
int midVal = a[mid];
//如果midVal值小于要搜索的key,则认为key在mid+1下标和high下标之间
if (midVal < key)
//所以把low赋值成mid + 1
low = mid + 1;
//如果midVal值大于要搜索的key,则认为key在0下标和mid-1下标之间
else if (midVal > key)
//所以把high赋值成mid - 1
high = mid - 1;
else
//直到midVal等于key时,才退出循环,返回相应下标
return mid; // key found
}
//如果实在是搜不到,就返回-(low + 1)
return -(low + 1); // key not found.
}
ソースから()Arrays.binarySearchを知っているあなたはそれをソートする必要があるので、データを位置決めするために検索するために二分法を使用し、リターンのマイナスたら、それは一致が見つからないことを意味することができます。
概要
アレイは、時々、他の方法の値を含む比較して判定をループするかどうかをここで実際の共有判定するが、この方法はあります)(Arrays.binarySearchの理解をより効率的であり得ますより良い方法を選択してください。