【问题标题】:How to check whether elements are identical in the list?如何检查列表中的元素是否相同?
【发布时间】:2012-08-22 06:43:25
【问题描述】:

Java 中是否有更简洁的方法来确认List 中的所有元素都相同?

boolean elementsAreIdentical() {
  return new HashSet<O>(list).size() == 1;
}

通过'cleaner',我想知道我们是否可以在不必创建全新对象的情况下做到这一点?根据大小,开销可能很大。

【问题讨论】:

  • 您如何定义“更清洁”?在代码可读性方面?在效率方面?
  • 定义“更清洁”。理想情况下,您希望在找到第一个不相同的元素后停止。
  • 设为 size() &lt;= 1 以便它也可以通过空集合。顺便说一句,你的方法很聪明!
  • @TomaszNurkiewicz 谢谢先生
  • 它有一个糟糕的最坏情况,它会创建一组与原始列表相同大小的集合。我更喜欢Object o = list.get(0); for (Object p : list) if (!p.equals(o)) return false; return true;

标签: java list set


【解决方案1】:

有点冗长,但它分别具有O(n)O(1) 时间和空间复杂度,但一旦找到第一个不相同的元素就会停止:

public static <T> boolean elementsAreIdentical(List<T> l) {
    if (!l.isEmpty()) {
        Iterator<T> it = l.iterator();
        T unique = it.next();
        while (it.hasNext()) {
            if (!it.next().equals(unique)) {
                return false;
            }
        }
    }
    return true;
}

【讨论】:

  • 可以使用equals缩短。尽管compareTo0 并不强烈暗示equalstrue,但List 使用equals 作为其合约的一部分来比较元素(即indexOfcontains、@987654333 @等)...所以使用起来很安全:-p
  • 对于ArrayList 以外的任何东西,这都有可怕的 O(n^2) 性能。你真的,真的必须使用迭代器。
  • @Joao 您需要在相等性测试之前添加!
【解决方案2】:
if (Collections.frequency(list, list.get(0)) == list.size()) {
  /* duplicates */
}

... 对于非空列表。否则,

final int n = list.size();
if (n == 0 || Collections.frequency(list, list.get(0)) == n) {
  /* duplicates */
}

请参阅Collections.frequency 的规范。这将比您的方法以及其他方法便宜,例如Collections.nCopies(list.get(0), list.size()).equals(list)

【讨论】:

  • 我认为只检查第一个元素在列表中出现的次数。如果所有元素都是唯一的,则不是。
  • 旁注:此方法依赖于通过 .equals 方法进行比较(请参阅 jdk 源代码),因此请确保列表中的任何内容都实现了正确的 .equals 和 .hashCode 方法(即使 hashCode这不是必需的,您应该始终同时覆盖两者)
  • @anio 它检查列表中的第一个元素是否在 O(N) 时间内构成整个列表。
  • @anio 他不是想找出所有元素是否都是唯一的,而是想知道它们是否都相同。
  • @Matt 这是List 合约中明确定义的约束。请参阅 List.indexOfList.containsList.remove。 :-)
【解决方案3】:

这是一种非常昂贵的方法来获得结果 - 如果是大型数据结构,您将面临内存占用和 CPU 周期方面的大量开销。我的第一个建议是在创建列表时控制它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多