我有两个清单:
答:列表< MyCustomObject>
B.列表< MyCustomObject>
MyCustomObject 有各种字段。例如,字段 id
在我的计划中,我需要检查两个列表中是否存在相同的 id 。所以目前我正在进行嵌套迭代:
for(int i=0;i<a.size();i++) {
MyCustomObject obj = a.get(i);
for(int j=0;j<b.size();j++) {
if( obj.getId().equals(b.get(j).getId()) {
//do something
break;
}
}
}
由于我经常需要执行此操作,因此我看起来没有优化,因为我经常迭代长列表。
如何优化此操作?
答案 0 :(得分:1)
您可以使用Map代替使用列表,例如HashMap - 假设您的id是int,它可能看起来像:
Map<Integer, MyCustomObject> objects = new HashMap<>();
//populate
objects.put(someCustomObject.getId(), someCustomObject);
//find an id:
CustomObject obj = objects.get(someId);
注意:假设id是唯一的。
答案 1 :(得分:1)
线性时间算法是将第一个列表中的ID值与布尔值进行散列。然后你在第二个列表上行进以查找ID值,如果散列已经包含该ID的密钥,则在两个列表之间共享ID。
您还可以通过按ID排序列表来改进O(n ^ 2)的运行时间,这是一个O(n log n)操作,并且线性地遍历列表以查看是否共享任何值。如果要保持列表的顺序,可以创建列表的另一个排序副本,但这会增加内存空间。
我相信,在不改变列表元素的顺序或创建新数据结构的情况下,您可以做到的一切都很好。不过,我不知道你的要求。