4

Listのすべての要素が同一であることを確認するためのよりクリーンな方法はJavaにありますか?

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

「クリーナー」によって、まったく新しいオブジェクトを作成せずにこれを実行できるかどうか疑問に思います。サイズによっては、オーバーヘッドがかなり大きくなる場合があります。

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

これは、結果を達成するための非常に費用のかかる方法です。大規模なデータ構造の場合、メモリフットプリントとCPUサイクルの両方でかなりのオーバーヘッドに直面します。私の最初の推奨事項は、リストの作成時にこれを制御することです。

于 2012-08-27T18:52:57.307 に答える
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 に答える