java比较两个ArrayList<String>,得出两者中的不同元素

本文介绍了一种在Java中比较两个ArrayList<String>并找出不同元素的方法。首先,将较短的列表元素放入HashMap中,然后遍历较长的列表,检查HashMap中是否存在该元素。若不存在,则将其添加到结果列表中。在实现过程中,要注意处理字符串中的空格问题以及其中一个列表为空的情况。

最近在做项目的过程中,遇到了比较两个内容为字符串List的需求,其内容为从数据库查出的数据与本地产生的数据进行对比,得出两者不同的元素,后来通过种种方式总结、优化出了一个比较简单的方法,不多说,直接贴代码:

 private static List<String> getdifferentList(List<String> list1,List<String> list2){
Map<String, Integer> map=new HashMap<String, Integer>();
List<String> longList=list1;
List<String> shortList=list2;
if(list2.size()>list1.size()){
longList=list2;
shortList=list1;
}
for(String string:shortList){//将shortList放到map中,map的value任意数字即可
map.put(string,0);
}
shortList.clear();//清空shortList,用于存放longList中有map中没有的数据
Integer in;
for(String string:longList){
   in=map.get(string);
if(null==in){
shortList.add(string);//longList中有map中没有的数据
}
}
return shortList;
}

此方法的流程就是先将长度短的list以值为Key放到map里,然后通过遍历长度长的list,依次调用get()方法,如果当前map中没有此key值,说明此元素为不重复元素,放到清理后的shortList里,执行完毕后返回出去。

需要注意两种细节问题,也是我当时遇到的:

1.注意两个参数list的String元素中是否含有空格,如有空格隐患最好用下trim()方法(当初数据库数据有空格,本地数据没有空格,总是得出两份数据,后来通过排查,得出是空格的问题)

2.根据需求来确定,如果其中一个list为空时,那么输出的将是另一个list的全部元素(避免其中一个list没有获取到值而传了进来)

@Override public List<MatchGameRunnerScoreInfoVo> listByGameId(String gameId, String groupIds, Integer teamId, Integer leg) { // 获取运动员信息 List<MatchGameRunnerDo> runnerDos = selectRunnerList(gameId, groupIds, teamId, leg); if (CollectionUtil.isEmpty(runnerDos)) { return ListUtil.empty(); } List<MatchGameRunnerScoreInfoVo> list = BeanUtils.toBean(runnerDos, MatchGameRunnerScoreInfoVo.class); List<RunnerScoreQueryParam> queryParams = list.stream().map(r -> new RunnerScoreQueryParam(r.getGameId(), r.getHcId(), r.getTeamId())).collect(Collectors.toList()); List<MatchGamePunchVo> matchGamePunchVos = matchGamePunchMapper.selectRunnerPunch(queryParams); List<MatchGameRunnerScoreVo> matchGameRunnerScoreVos = matchGameSorceMapper.selectRunnerScore(queryParams); // 2. 构建(gameId+hcId)到打卡记录的Map Map<String, List<MatchGamePunchVo>> punchMap = matchGamePunchVos.stream() .collect(Collectors.groupingBy( punch -> buildCompositeKey(punch.getGameId(), punch.getHcId()), Collectors.toList() )); // 3. 设置打卡记录到成绩对象 matchGameRunnerScoreVos.forEach(scoreVo -> { String key = buildCompositeKey(scoreVo.getGameId(), scoreVo.getHcId()); scoreVo.setPunchs(punchMap.getOrDefault(key, Collections.emptyList())); }); // 4. 构建(gameId+hcId)到成绩对象的Map Map<String, MatchGameRunnerScoreVo> scoreMap = matchGameRunnerScoreVos.stream() .collect(Collectors.toMap( score -> buildCompositeKey(score.getGameId(), score.getHcId()), Function.identity() )); // 5. 设置成绩值到InfoVo list.forEach(infoVo -> { String key = buildCompositeKey(infoVo.getGameId(), infoVo.getHcId()); MatchGameRunnerScoreVo scoreVo = scoreMap.get(key); if (scoreVo != null) { setRunnerScoreValue(infoVo, scoreVo); } }); return list; }报错at java.util.stream.Collectors.lambda$throwingMerger$0(Collectors.java:133) at java.util.HashMap.merge(HashMap.java:1255) at java.util.stream.Collectors.lambda$toMap$58(Collectors.java:1320) at java.util.stream.ReduceOps$3ReducingSink.accept(ReduceOps.java:169) at java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1384) at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:482) at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:472) at java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:708) at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234) at java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:566) at cn.iocoder.yudao.module.match.service.impl.MatchGameRunnerServiceImp.listByGameId(MatchGameRunnerServiceImp.java:152) at cn.iocoder.yudao.module.match.service.impl.MatchGameRunnerServiceImp$$FastClassBySpringCGLIB$$e90dd7ea.invoke(<generated>) at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218)为什么,怎么解决
最新发布
04-03
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值