You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java中如何对ArrayList<List<String>>使用Collections.binarySearch方法

报错根本原因

你调用的Collections.binarySearch无比较器重载方法,要求列表内所有元素、待查找的key都必须实现Comparable接口,且互相之间可正常比较。
你的arraylistdata存储的元素是List<String>类型,而id大概率是字符串类型,List<String>和String本身不属于可互相比较的类型,运行时会直接抛出类型转换异常。
就算你传入的id是List<String>类型,调用二分查找也需要满足前置条件:列表已经按照对应的比较规则升序完成排序,未排序的列表调用二分查找的结果完全不可预期。

正确解决方法

情况1:你需要查找内部List<String>中包含id的外层列表下标

该场景不适合用二分查找,直接遍历即可,示例代码:

int targetIndex = -1;
for (int i = 0; i < arraylistdata.size(); i++) {
    if (arraylistdata.get(i).contains(id)) {
        targetIndex = i;
        break;
    }
}

情况2:确定要使用二分查找,且内部List<String>的比较规则明确

首先需要按照自定义比较规则给arraylistdata完成排序,再调用带比较器的binarySearch重载方法即可。
示例以「取子列表的第一个元素作为比较依据」为例,你可以替换成自己的业务规则:

// 第一步:按照比较规则给列表排序
Collections.sort(arraylistdata, (subList1, subList2) -> subList1.get(0).compareTo(subList2.get(0)));

// 第二步:用相同规则执行二分查找
// 构造虚拟子列表用于匹配比较规则
int index = Collections.binarySearch(arraylistdata, Collections.singletonList(id), 
    (subList, targetSubList) -> subList.get(0).compareTo(targetSubList.get(0)));

注意:查找返回值如果为负数代表未匹配到元素,-(返回值 + 1)为该元素应该插入的排序位置。


内容的提问来源于stack exchange,提问作者liltang

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 04:27:01