为何Java的Collections.binarySearch()返回-6?元素降序排序后位于位置1
问题原因分析与解决方案
嘿,我来帮你理清这个困惑!你遇到的-6返回值,核心问题出在**Collections.binarySearch()的默认行为和你的列表排序不匹配**上。先结合你的代码和场景拆解一下:
你的代码片段:
import java.util.ArrayList; import java.util.Collections; import java.util.List; public class Test { public static void main(String[] args) { List<Integer> al = new ArrayList<>(); al.add(100); al.add(30); al.add(10); al.add(...); // 后续添加的元素 // 调用Collections.binarySearch(al, 目标元素) } }
为什么会返回-6?
首先得明确binarySearch的两个关键规则:
- 默认情况下,它要求列表必须是升序排序的,否则搜索结果完全不可靠;
- 当元素找不到时,返回值是
-(插入点) - 1,这里的「插入点」是指如果列表是升序,该元素应该被插入的位置(第一个大于该元素的索引,或者列表长度如果所有元素都比它小)。
你的列表是降序的(比如[100,30,10,5,2]),假设你要找的元素是30(它在降序列表的索引1),但默认的binarySearch会把列表当成升序来处理:
- 第一步取中间元素(索引2的
10),按升序逻辑比较:30 > 10,于是它去右半部分(索引3-4)继续搜索; - 右半部分的
5和2都比30小,所以它判定这个元素应该插在列表末尾,插入点是5; - 按照规则计算:
-(5) - 1 = -6,这就是你看到的结果。
怎么解决?
有两种简单的修复方式:
- 方式一:将列表升序排序后再搜索
Collections.sort(al); // 先把列表改成升序 int index = Collections.binarySearch(al, 30); // 此时能正确返回对应索引 - 方式二:传入降序比较器,适配你的列表排序
// 告诉binarySearch你的列表是降序的,用反向比较器 int index = Collections.binarySearch(al, 30, Collections.reverseOrder());
这样就能正确找到目标元素在降序列表中的索引1了。
内容的提问来源于stack exchange,提问作者user9608350
相关产品推荐
相关产品推荐

