4

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

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

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

4

3 回答 3

6
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)

于 2012-08-27T18:51:51.553 回答
0

它有点冗长,但它分别具有时间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;
}
于 2012-08-27T18:58:23.637 回答
0

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

于 2012-08-27T18:52:57.307 回答