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
相关产品推荐
相关产品推荐

