比较两个ArrayList返回公共元素时add方法类型不匹配问题求解
问题原因梳理
- 类型不匹配:
matchCriteria声明为List<Loading>,只能存储Loading类型对象,报错行尝试添加String类型的test变量,直接触发类型校验错误 - 逻辑判断错误:
matchCriteria.contains(test)是在Loading对象集合中判断是否存在字符串,未自定义equals规则的前提下永远返回false,完全不符合匹配Loading属性的需求 - 拼写错误:循环变量声明
Sring应为String - 初始化逻辑错误:
matchCriteria初始化时直接传入list1会提前把所有元素加入集合,后续重复添加会导致结果冗余,应该初始化为空集合 - 边界遗漏:当前写法只取了
list2第一个元素的testQueryValues,如果需要匹配所有Test元素的查询值,需要先遍历list2完成全量收集
修复方案
假设Loading类中需要匹配的字符串属性Getter方法为getMatchField(),你可以替换为实际业务对应的字段方法,修复后代码如下:
private List<Loading> matchLists(List<Loading> list1 ,List<Test> list2) { // 初始化空结果集合 List<Loading> matchCriteria = new ArrayList<>(); // 收集list2所有Test对象的查询值,转HashSet提升匹配效率 Set<String> allTestQueryValues = new HashSet<>(); for (Test testItem : list2) { allTestQueryValues.addAll(testItem.getTestQueryValues()); } // 遍历list1匹配属性 for(Loading loadingItem : list1) { // 替换为Loading类实际要匹配的属性Getter String loadingMatchValue = loadingItem.getMatchField(); if (allTestQueryValues.contains(loadingMatchValue)) { // 匹配成功添加对应Loading对象,而非字符串 matchCriteria.add(loadingItem); } } return matchCriteria; }
如果你确实只需要取list2第一个元素的查询值,把收集
allTestQueryValues的循环替换为原有list2.get(0).getTestQueryValues()即可,注意提前对list2做非空判断避免空指针异常。
优化说明
提前把查询值转成HashSet可以把单次匹配的时间复杂度从O(n)降到O(1),数据量较大时性能提升明显。
内容的提问来源于stack exchange,提问作者Aspirer
相关产品推荐
相关产品推荐

