Java Arrays二进制搜索

时间:2015-07-09 14:30:57

标签: java arrays sorting arraylist binary-search

我没有关于 Arrays.binarySearch 的更多信息。 Arrays.binarysearch正是他们正在做的事情。为什么3 -3控制台输出;

import java.util.*;
    public class VLA2 implements Comparator<VLA2> {
        int dishSize;
        public static void main(String[] args) {
            VLA2[] va = {new VLA2(40), new VLA2(200), new VLA2(60) ,new VLA2(70)};
            Arrays.sort(va, va[0]);

            int index = Arrays.binarySearch(va, new VLA2(40), va[0]);
            System.out.print(index + " ");
            index = Arrays.binarySearch(va, new VLA2(69), va[0]);
            System.out.print(index);
        }
        public int compare(VLA2 a, VLA2 b) {
            return b.dishSize - a.dishSize;
        }
        VLA2(int d) { dishSize = d; }
    }

2 个答案:

答案 0 :(得分:2)

您的数组已排序为{200, 70, 60, 40},因为compare()方法在a.dishSize < b.dishSize时返回正值。

因此,当您搜索VLA2(40)时,您会在第3位找到它。

搜索VLA2(69)时,找不到它。因此,根据定义,方法的返回值为-insertion_point - 1在这种情况下,插入点将为2,因此返回值为-3。

Arrays.sort()方法按升序排序。但成员之间的关系由比较器定义。 根据定义,当比较符时,比较器必须返回负值。 b,当a> 1时为正值。 b。如果您希望升序自然,请更改compare()方法以返回a.dishSize - b.dishSize。

顺便说一下,对象作为自己的比较器是不常见的。理想情况下,一个类只代表一个概念。在这种情况下,将两个概念混合到一个类中会产生如下调用:

        int index = Arrays.binarySearch(va, new VLA2(40), va[0]);

在这里,您传递的是va [0],而不是将其用作VLA2值,而是将其用作比较器。这可能有些令人困惑。

答案 1 :(得分:1)

对数组进行排序后,它看起来就像 {200,70,60,40},因为你的比较器按降序排序。

  int index = Arrays.binarySearch(va, new VLA2(40), va[0]);

这将在排序数组中返回40的索引,即3

如果元素不在数组中,binarySearch方法将返回( - (插入点)-1)。插入点是应插入元素的索引,以使数组按排序顺序排列。 在这里

    index = Arrays.binarySearch(va, new VLA2(69), va[0]);

要保持数组排序69应插入index = 2
{200,70,69,60,40} 所以(-2)-1 = -3。所以二进制搜索返回-3。 请注意,69不会被插入。只有插入点将由binarySearch函数计算。

如果您正在寻找269, 要保持数组排序269应插入index = 0 {269,200,70,...} 所以binarySearch()返回-0-1 = -1