执行“包含”的有效方法两个列表之间

发布于 2024-11-28 15:45:12 字数 367 浏览 2 评论 0原文

我有 2 个整数列表,

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

我想找出其中的重复项,我有我通常的方法:-

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

我听说 contains()O(n) code>,使我的实现O(n^2)

有没有更好的方法来做到这一点(小于O(n^2))?

I have 2 lists of integers,

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

I want to find out duplicate items in both of them, I have my usual approach:-

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

I've heard contains() is O(n), making my implementation O(n^2).

Is there a better way to do this, (less than O(n^2)) ?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

贱贱哒 2024-12-05 15:45:12

当然 - 首先从列表之一创建一个 HashSet

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

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

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

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

请注意,如果您的两个列表一开始就已经排序,那么您的效率可能会更高。您只需同时迭代两者,将“光标”向前移动到当前具有较小值的迭代器。

Sure - create a HashSet<Integer> from one of the lists first.

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

If you want to find all duplicate entries, you don't even need to write your own loop, as Set<E> provides everything you need...

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

Afterwards, set will be the intersection of the two lists.

Note that you can be even more efficient than this if both your lists are already sorted to start with. You just iterate over both at the same time, moving the "cursor" forward for whichever iterator currently has the smaller value.

×纯※雪 2024-12-05 15:45:12

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

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

The usual way is to add each item from the first list to a HashSet, and then test each item in the second list for existence in that set:

Set<Integer> firstSet = new HashSet<Integer>(l1);
for (Integer i : l2) {
    if (firstSet.contains(i)) {
        // Do stuff
    }
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文