我正在尝试将自定义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
有什么用?我不认识男人。
答案 0 :(得分:3)
int compare(T s1, T s2)
界面中的Comparator<T>
返回一个数字,表示s1
是小于,等于还是大于s2
;你的代码比较s1
和s2
是否相等,这是不正确的。
您需要更改代码的return
行,以调用String
对象的字典比较方法,如下所示:
return reverse1.compareTo(reverse2);
另一个问题是您的数组没有按照相同的比较器进行排序。这就是您在搜索时获得负索引的原因。在拨打binarySearch
之前添加此行以解决问题:
Arrays.sort(words, scmp);