Java中对存储自定义对象的ArrayList使用二分查找参数报错如何解决
问题根因
你调用Collections.binarySearch()时传入的参数类型不匹配泛型约束,触发编译错误:
- 你的
dictionaryList是存储DictionaryElements自定义对象的列表,而你传入的查找key是String类型的英文单词,两个类型不存在可兼容的继承/实现关系,不符合双参数binarySearch方法要求的「列表元素类型和查找key类型一致」的规则。 - 额外说明:你让
DictionaryElements同时实现Comparable和Comparator接口的设计不符合规范,Comparable是定义类本身的默认比较规则,Comparator是作为独立比较器供外部使用,两类职责完全分开,不需要同时实现。
修复方案
方案1:构造同类型查找Key(推荐,复用已有的比较逻辑)
把用户输入的英文单词封装为DictionaryElements对象,仅需给word字段赋值即可,直接调用双参数二分查找方法:
// 假设你已经给DictionaryElements类实现了word字段的setter方法 DictionaryElements searchKey = new DictionaryElements(); searchKey.setWord(wordInEnglish); // 调用二分查找,返回值为匹配元素的下标,负数代表未找到 int resultIndex = Collections.binarySearch(dictionaryList, searchKey);
方案2:使用带自定义比较器的重载方法
如果不想额外构造DictionaryElements对象,可以调用三参数的binarySearch重载方法,手动指定比较规则直接匹配字符串:
int resultIndex = Collections.binarySearch(dictionaryList, wordInEnglish, (dictionaryElement, targetWord) -> dictionaryElement.getWord().compareTo(targetWord) );
注意事项
- 二分查找执行前必须保证列表已经按查找时使用的排序规则完成排序,你当前已经按
word字段排序的场景满足要求。 - 建议调整
DictionaryElements的实现,仅保留Comparable<DictionaryElements>接口的实现即可,若需要其他自定义排序规则(比如按翻译排序),单独编写独立的Comparator实现类即可。
内容的提问来源于stack exchange,提问作者M G
相关产品推荐
相关产品推荐

