如何对2个LIST中的元素进行比较

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何对2个LIST中的元素进行比较相关的知识,希望对你有一定的参考价值。

例如listA 和listB

对其进行比较,如果有相同的,打印出.
希望有高效的方法,因为listA 和listB 包含的数据量很大
还有一点就是 listA中包含的有 “ID”“NAME”“AGE”列
listB中包含的有“PID”
就是比较出listB中的“PID”和listA中的“ID”有没有相同的
---------------------------------------------------------
我也循环出来 那样做的,我就担心如果数据量很大,这样循环出来会不会很慢....
for(int i=0; i<al.size(); i++)
int biaoshi=0;//标识:根据时间差查询出即将到期缴费的合同
lhm = (LinkedHashMap) al.get(i);
contractID = StringUtil.str2Int(StringUtil.null2Empity(lhm.get("CONTRACT_ID")));
for(m=0; m<alcontractbytime.size();m++)
acbt = (LinkedHashMap) alcontractbytime.get(m);//根据时间差查询出即将到期缴费的合同
contractID_willdate= StringUtil.str2Int(StringUtil.null2Empity(acbt.get("CONTRACT_ID")));
if(contractID_willdate==contractID)
biaoshi=1;
break;

貌似只能用循环来解决。

listA的数据量比listB的数据量大的时候:
for (int i = 0; i < listB.toArray().length; i++)
if (listA.contains(listB.toArray()[i]))
System.out.println(listB.toArray()[i]);



从问题补充来看listA应该不是直接存放数据,而是存放数据的集合,这样就需要把具体什么类型的集合说清除否则无法解答。

假设listA用一个数组存放“ID”“NAME”“AGE”列而listB直接存放“PID”的话。
listA.add(new String[] "id", "name", "age");
listB.add("pid");
for (int i = 0; i < listA .toArray().length; i++)
if (listB .contains(((String[])listA .toArray()[i])[0]))
System.out.println(
"id : " + ((String[])listA .toArray()[i])[0] +
"name : " + ((String[])listA .toArray()[i])[1] +
"age : " + ((String[])listA .toArray()[i])[2]
);



据我现在的水平只能想到用循环了,特别是你的List中放的还那么复杂。
虽然数据量大的时候用循环是很消耗资源,但是没有更好选择的情况下也只能用循环了。
参考技术A 我觉得没有必要把数据放在ListA和ListB中比较。
如果数据来源都是数据库的话,我觉得在数据库中完成操作最好不过了。

如果非要在ListA和ListB中比较Id和Uid相同的元素,我觉得可以简化一点。
ID和UID元素在ListA和ListB中应该都是唯一的。
那可以用Map来保存元素,只保存ID
Map<Long,Long> mapA = new HashMap<Long,Long>();
然后通过ListB到MapA中查询。

for(... ... :ListB)
if(mapA.get(user.getId())!=null)//存在相同的
tempList.add(...); //把相同的都保存到一个临时list中
mapA.remove(user.getId());
参考技术B 楼主,你说的“listA 和listB 包含的数据量很大”是多大呢?都有数十万个元素?

你担心如果数据量很大,循环出来会很慢,就是说你还没真正去跑过程序看看是不是真的很慢?为什么不跑跑看看真实的速度是否太慢?现在没有那么多数据的话何不生成足够的伪数据来测试?

从你贴上来的代码看来,你的两个List的每一个元素都是一行纪录,都是LinkedHashMap实例,也就是说每一行纪录都带有列名称。那不是很浪费空间吗?为什么不把列名不重复的只收在一个地方,然后以ArrayList储存每一行纪录?

那两个List的具体类又是什么?ArrayList?

整个资料库的结构可以说说吗?资料库必须是纯Java吗?空间方面的限制快碰上了吗?(若还有很多空间可用,也许可以多建立一个小table,以空间换取速度)

单单看你目前贴上来的代码就有一些地方可以进行优化的。但做任何优化之前,弄清楚上面提出的所有问题的答案可以让我们更有效、恰当地进行优化(比如有时设计或数据结构的改变远胜于纯粹代码方面的优化)。

你尽量回答吧。

以上是关于如何对2个LIST中的元素进行比较的主要内容,如果未能解决你的问题,请参考以下文章

比较java中的List元素

Vector与List在对序列元素进行增删操作时性能的比较

Vector与List在对序列元素进行增删操作时性能的比较

Vuejs2 - 如何将两个数组中的元素与计算属性进行比较?

两个list进行比较

java中,如何比较2个list,去掉相同的,取不同的,再组合成一个list