【问题标题】:Check duplicate entries in a List [duplicate]检查列表中的重复条目[重复]
【发布时间】:2012-12-06 15:04:26
【问题描述】:

可能重复:
Java: Detect duplicates in ArrayList?

要检查列表是否有重复条目,我将其转换为 HashSet 并比较大小是否有任何不匹配。大家有什么更好的办法吗?

【问题讨论】:

  • 使用 list.indexOf 和 list.lastIndexOf。它包含重复的对象,lastIndexOf 将大于 indexOf
  • @UsmanSaleem 我想这会降低效率。
  • 那你为什么要把它们存储在列表中呢?
  • @NimChimpsky This other answer 效率更高。
  • @qualtar 您认为这是如何完成的?当然是 O(n):构造函数将遍历列表中的项目并将它们一一添加到集合中。不信可以看代码。

标签: java collections


【解决方案1】:

如果您在集合的开头有重复,此代码可能会提前中断:

HashSet<Integer> hashSet = new HashSet<>();
for(Integer i : myList) {
  if(!hashSet.add(i)) return true;
}

正如 Pshemo 指出的那样,add 方法返回一个 bool 元素是否实际已添加到集合中,而不是已经存在于其中。

【讨论】:

  • 虽然这个概念是可转置的,但您的代码不是 Java。 Here is a Java version.
  • 上面的答案还不错,只是有一个问题:关键字var和foreach在Java中无效。
  • @Muddu 这比将列表转换为 HashSet 效率低。您的方法是 order(n),而转换为 HashSet 并且比较只需要 O(1)。
  • @qualtar 真的吗?不知道,以为是 O(n),因为 HashSet(Collection c)-constructor 似乎在 AbstractCollection docjar.com/html/api/java/util/AbstractCollection.java.html 上调用 addAll。还是我需要选择不同的方法?
  • 在添加 Java 时,必须检查 set 是否已经具有该元素,因此您的算法会检查它两次。更优化的版本可能是for (Integer i : list) {if (!set.add(i)) return true;} return false;
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-05-30
  • 1970-01-01
  • 2019-12-29
  • 2020-12-16
  • 2012-05-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多