Java 数组二进制搜索

Java Arrays 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; }
    }

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

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

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

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

顺便说一句,一个对象作为它自己的比较器是不寻常的。理想情况下 class 代表一个概念。在这种情况下,将两个概念混合为一个 class 会导致这样的调用:

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

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

排序后你的数组看起来像 {200,70,60,40} 作为您的比较器按降序排序。

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

这将 return 排序数组中的索引 40 即 3

如果元素不存在于数组中,binarySearch 方法将 return (-(插入点) -1)。插入点是应该插入元素以保持数组有序的索引。 这里

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

为了保持数组排序 69 应该插入到 index=2
{200,70,69,60,40} 所以 (-2)-1 = -3 。所以二进制搜索returns -3。 请注意,不会插入 69。 binarySearch 函数只会计算插入点。

如果您要搜索 269, 为了保持数组排序 269 应该插入到 index=0 {269,200,70,...} 所以 binarySearch() returns -0-1 = -1