判断数组中是否包含了某个数值

使用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()方法后,可以根据实际情况选择更好的方法。

发布了297 篇原创文章 · 获赞 311 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/weixin_38106322/article/details/105238071