binarySearch与自定义Comparator-object不检查第一个元素

时间:2014-03-02 12:01:34

标签: java arrays

我正在尝试将自定义Comparator对象与java.util.Arrays.binarySearch一起使用。

我想在数组中搜索一个String,其反向值等于目标String元素的反向值(哑,我知道,但它仅用于学习)。

但是,当我尝试在数组上运行binarySearch时,除数组元素0外,所有元素都匹配正确。

比较

class SearchComparator<T extends Comparable<T>> implements Comparator<T> {
    public int compare(T s1, T s2) {

        String reverse1 = new StringBuilder((String)s1).reverse().toString();
        String reverse2 = new StringBuilder((String)s2).reverse().toString();

        return reverse1.equals(reverse2) ? 0 : -1;
    }
}

主要功能:

String[] words = new String[]{"One", "Two", "Three", "Four"};
SearchComparator scmp = new SearchComparator();

System.out.println(Arrays.deepToString(words));

System.out.println(Arrays.binarySearch(words, "One", scmp));
System.out.println(Arrays.binarySearch(words, "Two", scmp));
System.out.println(Arrays.binarySearch(words, "Three", scmp));
System.out.println(Arrays.binarySearch(words, "Four", scmp));

输出:

[One, Two, Three, Four]
-5
1
2
3

-5有什么用?我不认识男人。

1 个答案:

答案 0 :(得分:3)

int compare(T s1, T s2)界面中的Comparator<T>返回一个数字,表示s1是小于,等于还是大于s2;你的代码比较s1s2是否相等,这是不正确的。

您需要更改代码的return行,以调用String对象的字典比较方法,如下所示:

return reverse1.compareTo(reverse2);

另一个问题是您的数组没有按照相同的比较器进行排序。这就是您在搜索时获得负索引的原因。在拨打binarySearch之前添加此行以解决问题:

Arrays.sort(words, scmp);