首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >带有自定义比较器的binarySearch -对象不检查第一个元素

带有自定义比较器的binarySearch -对象不检查第一个元素
EN

Stack Overflow用户
提问于 2014-03-02 04:01:34
回答 1查看 170关注 0票数 2

我正在尝试制作一个自定义比较器对象,以便与java.util.Arrays.binarySearch一起使用。

我希望在数组中搜索其反向值等于目标字符串元素的反向值的字符串(我知道,这只是为了学习)。

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

比较器:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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;
    }
}

主要功能:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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));

输出:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[One, Two, Three, Four]
-5
1
2
3

-5怎么了?我不认识男人。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-03-02 04:03:20

来自Comparator<T>接口的Comparator<T>返回一个数字,该数字指示s1是小于、等于还是大于s2;代码比较s1s2是否相等,这是不正确的。

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
return reverse1.compareTo(reverse2);

另一个问题是您的数组没有按照相同的比较器进行排序。这就是为什么在搜索时会得到负索引的原因。在调用binarySearch以修复问题之前添加这一行:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Arrays.sort(words, scmp);
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22127259

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文