检查List内对象值之间相等性的优化方法

时间:2014-02-07 19:15:43

标签: java performance iteration java-7 nested-loops

我有两个清单:
答:列表< 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;
       }
   }
 }

由于我经常需要执行此操作,因此我看起来没有优化,因为我经常迭代长列表。

如何优化此操作?

2 个答案:

答案 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)操作,并且线性地遍历列表以查看是否共享任何值。如果要保持列表的顺序,可以创建列表的另一个排序副本,但这会增加内存空间。

我相信,在不改变列表元素的顺序或创建新数据结构的情况下,您可以做到的一切都很好。不过,我不知道你的要求。