有效的方式'包含'两个名单之间

时间:2011-08-08 18:27:28

标签: java collections arraylist time-complexity

我有2个整数列表,

l1 = new ArrayList();
l2 = new ArrayList();

我想在他们两个中找出重复的项目,我有我惯常的做法: -

for (Integer i : l1)
{
 if(l2.contains(i)){
    System.out.println("Found!");
  } 
}

我听说contains()O(n),正在实施O(n^2)

有更好的方法吗,(少于O(n^2))?

2 个答案:

答案 0 :(得分:7)

当然 - 首先从其中一个列表中创建HashSet<Integer>

Set<Integer> set = new HashSet<Integer>(l2);
for (Integer i : l1) {
    if (set.contains(i)) {
        System.out.println("Found!");
    }
}

如果你想找到所有重复的条目,你甚至不需要编写自己的循环,因为Set<E>提供了你需要的一切......

Set<Integer> set = new HashSet<Integer>(l2);
set.retainAll(new HashSet<Integer>(l1));

之后,set将成为两个列表的交集。

请注意,如果您的列表都已经排序,那么您可以比这更有效率。您只需同时迭代这两个,向前移动“光标”,以便迭代器当前具有较小的值。

答案 1 :(得分:5)

通常的方法是将第一个列表中的每个项目添加到HashSet,然后测试第二个列表中的每个项目是否存在于该集合中:

Set<Integer> firstSet = new HashSet<Integer>(l1);
for (Integer i : l2) {
    if (firstSet.contains(i)) {
        // Do stuff
    }
}
相关问题