Java中Arrays.binarySearch()索引详解
一、必须要在升序排序后再使用binarySearch(),否则查找会变得花里胡哨,即找不到正确元素下标索引。
下面展示一些 错误示范
。
int[] arr = new int[]{
10,8,6,5,2,1};
// Arrays.sort(arr);升序排序
int ans = Arrays.binarySearch(arr,1);
System.out.println(ans);
上述程序运行结果为 ans = -1
,但是很明显,1的确存在数组arr中,究其原因是因为binarySearch采用的是二分查找,二分查找的算法要求所要查找的数组是一个已经排好序的数组。
要想得到正确的答案只需要解开注释
int[] arr = new int[]{
10,8,6,5,2,1};
//升序排序
Arrays.sort(arr);
int ans = Arrays.binarySearch(arr,1);
System.out.println(ans);
即可得到正确答案ans = 0
。
二、binarySearch(Object[] a, Object key)搜索结果分析。
a:要搜索的数组,key:要搜索的值。
利用binarySearch(Object[] a, Object key),搜索时,会出现以下四种情况。
1、在数组中搜索到key值,返回搜索值的索引下标;
2、搜索值key在数组范围内,但不属于数组元素,则从1开始计数,返回“-插入点索引值”;
3、搜索值key小于数组最小元素值,返回“-1”;
4、搜索值key大于数组最大元素,返回“-(length+1)”。
下面举个例子:
int[] arr = new int[]{
1,3,5,7,9};
Arrays.sort(arr);
//1、在数组中搜索到key值,返回搜索值的索引下标;
int x1 = Arrays.binarySearch(arr, 5);
//2、搜索值key在数组范围内,但不属于数组元素,则从1开始计数,返回“-插入点索引值”;
int x2 = Arrays.binarySearch(arr, 4);
//3、搜索值key小于数组最小元素值,返回“-1”
int x3 = Arrays.binarySearch(arr, 0);
//4、搜索值key大于数组最大元素,返回“-(length+1)”。
int x4 = Arrays.binarySearch(arr, 10);
结果为x1 = 2; x2 = -3; x3 = -1; x4 = -6
。
三、binarySearch(Object[] a, int fromIndex, int toIndex,Object key)搜索结果分析。
a:要搜索的数组,fromIndex:指定范围的开始处索引(包含),toIndex:指定范围的结束处索引(不包含),key:要搜索的值。
利用binarySearch(Object[] a, int fromIndex, int toIndex,Object key),搜索时,也会出现以下四种情况。
1、在规定的搜索范围中搜索到key值,返回搜索值的索引下标;
2、搜索值key在规定的搜索范围内,但不属于数组元素,则从1开始计数,返回“-插入点索引值”;
3、搜索值key小于数组下标为fromIndex的值,返回“-(fromIndex + 1)”;
4、搜索值key大于或等于数组下标为toIndex的值,返回“-(toIndex+1)”。
下面举个例子:
int[] arr = new int[]{
1,3,5,7,9};
Arrays.sort(arr);
//1、在规定的搜索范围中搜索到key值,返回搜索值的索引下标;
int x1 = Arrays.binarySearch(arr, 1,3,5);
//2、搜索值key在规定的搜索范围内,但不属于数组元素,则从1开始计数,返回“-插入点索引值”;
int x2 = Arrays.binarySearch(arr, 1,3,4);
//3、搜索值key小于数组下标为fromIndex的值,返回“-(fromIndex + 1)”;
int x3 = Arrays.binarySearch(arr, 1,3,1);
//4、搜索值key大于或等于数组下标为toIndex的值,返回“-(toIndex+1)”。
int x4 = Arrays.binarySearch(arr, 1,3,7);
结果为x1 = 2; x2 = -3; x3 = -2; x4 = -4
。
感谢阅读,如有错误,不吝赐教。