1. ホーム

[解決済み】2つの異なるリストが全く同じ要素を含んでいるかどうかを調べる簡単な方法?

2022-03-30 14:05:37

質問

標準的なJavaライブラリで、2つのListが全く同じ要素を含んでいるかどうかを調べる最も簡単な方法は何ですか?

2つのListが同じインスタンスかどうかは問題ではなく、Listの型パラメータが異なっても問題ないはずです。

List list1
List<String> list2; 
// ... construct etc

list1.add("A");
list2.add("A"); 
// the function, given these two lists, should return true

きっと、私の顔をじっと見ている何かがあるのでしょう :-)


EDIT: 明確にするために、私はEXACT同じ要素と数を、順番に探していたのです。

どのように解決するのですか?

順番を気にするのであれば、equalsメソッドを使えばいいのです。

list1.equals(list2)

javadocより。

指定されたオブジェクトと このリストが等しいかどうかを調べます。真を返します。 指定されたオブジェクトが もリストであり、両方のリストが同じ サイズ、および対応するすべてのペアの の要素は等しい。 (2つの要素e1,e2が等しいのは (e1==null ? e2==null : e1.equals(e2)). 言い換えれば、2つの リストは、以下の場合に等しいと定義されます。 同じ要素を同じように含む の順番になります。この定義により equals メソッドが正しく動作する の異なる実装にまたがって リストインターフェイス

もし順番に関係なくチェックしたいなら、すべての要素をSetsにコピーして、できたSetsに対してequalsを使うことができる。

public static <T> boolean listEqualsIgnoreOrder(List<T> list1, List<T> list2) {
    return new HashSet<>(list1).equals(new HashSet<>(list2));
}

この方法の限界は、順序だけでなく、重複する要素の頻度も無視されることである。例えば list1 が ["A", "B", "A"] で、かつ list2 は、["A", "B", "B"] であった。 Set のアプローチでは、両者はイコールとみなされる。

順序にはこだわらないが、重複の頻度にはこだわりたい場合は、以下のいずれかの方法があります。