提问者:小点点

如何使用比较器执行二进制搜索?


我正试图用不区分大小写的比较器执行二分搜索,但无论我怎么做,我总是得到错误。。。

试验1:

Arrays.binarySearch(arr, "text", String::compareToIgnoreCase);

来源:https://stackoverflow.com/A/30191946/900394

这会产生一个错误:

语言级别“%7”不支持方法引用

假设我想和Java 7一起工作,我尝试了这些额外的方法:

试验2:

Comparator<String> caseInsensitiveComparator = new Comparator<String>() {
        @Override
        public int compare(String s, String t1) {
            return s.compareToIgnoreCase(t1);
        }
    };

Arrays.binarySearch(arr, "text", caseInsensitiveComparator);

来源:https://stackoverflow.com/A/14154185/900394

错误:

必填类型:比较器<;? 提供了超级对象>
:比较器

请注意,此方法适用于对列表进行排序(即此比较器适用于collections.sort())

试验3:

Arrays.binarySearch(arr, "text", String.CASE_INSENSITIVE_ORDER);

来源:https://stackoverflow.com/A/17491652/900394

错误:

必填类型:比较器<;? 提供了超级对象>
:比较器

请注意,此方法也在处理collections.sort()

试验4:

生成实现比较器的类:

public class CaseInsensitiveComparatorClass implements Comparator<String> {

    @Override
    public int compare(String s, String t1) {
        return s.compareToIgnoreCase(t1);
    }
}

Arrays.binarySearch(arr, "text", new CaseInsensitiveComparatorClass ());

来源:https://stackoverflow.com/A/30191797/900394

错误:

必填类型:比较器<;? super java.lang.Object>
提供:CaseInsensitiveComparatorClass

请注意,此方法也在处理collections.sort()

你能给我提供一个有效的方法吗?或者指出我做错了什么?

编辑:

这是arr的声明:

个人专用列表; lst;

所以它实际上是一个列表,我在方法调用时将其转换为数组:

Arrays.BinarySearch(lst.ToArray(),...


共3个答案

匿名用户

关于您的第一个示例,您使用了Java 8中的方法引用特性(String::CompareToIgnoreCase),但是您用Java 7编译/执行代码。 把《Java》的版本至少改成《Java 8》。 还要记住,在使用Arrays.BinarySearch之前,应该对数组进行排序。

对于集合,可以使用以下方法:Collections.BinarySearch()

为了将列表转换为带有泛型参数的数组,请使用以下方法:

lst.ToArray(新字符串[0]);

匿名用户

注意,应该根据数组对数组进行排序。binarySearch javadoc:

使用二分搜索算法在指定数组中搜索指定对象。 在进行此调用之前,必须根据指定的比较器(如sort(t[],comparator)方法)将数组按升序排序。 如果不对其进行排序,则结果是未定义的。 如果数组包含多个与指定对象相等的元素,则无法保证会找到哪一个。

字符串本身实现了可比性接口,因此,不需要实现新的接口

下面是可视化如何使用Arrays.BinarySearch的简短代码片段。

public class BinarySearch {
    public static void main(String[] args) {
        final String[] arr = {"one", "two", "three", "four", "text"};

        Arrays.sort(arr);
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i] + " ");
        }
        System.out.println();
        System.out.println(Arrays.binarySearch(arr, "text", String.CASE_INSENSITIVE_ORDER));
    }
}

匿名用户

请尝试以下代码:

    String[] arr = {"a","b","c"};

    int i = Arrays.binarySearch(arr, "B", new Comparator<String>() {
        @Override
        public int compare(String o1, String o2) {
            return o1.compareToIgnoreCase(o2);
        }
    });

    System.out.println(i);