標準 Java ライブラリで、2 つのリストにまったく同じ要素が含まれているかどうかを確認する最も簡単な方法は何ですか?
2 つのリストが同じインスタンスであるかどうかは問題ではなく、リストの型パラメータが異なっているかどうかも問題ではありません。
例えば
List list1
List<String> list2;
// ... construct etc
list1.add("A");
list2.add("A");
// the function, given these two lists, should return true
おそらく、何かが私を見つめているのでしょう :-)
編集: 明確にするために、私は順番通りに、正確に同じ要素と要素の数を探していました。
ベストアンサー1
順序を気にする場合は、equals メソッドを使用します。
list1.equals(list2)
からjavadoc:
指定されたオブジェクトとこのリストが等しいかどうかを比較します。指定されたオブジェクトもリストであり、両方のリストのサイズが同じで、2 つのリスト内の対応する要素のペアがすべて等しい場合にのみ、true を返します。(2 つの要素 e1 と e2 は、(e1==null ? e2==null : e1.equals(e2)) の場合に等しいです。) つまり、2 つのリストは同じ要素が同じ順序で含まれている場合に等しいと定義されます。この定義により、List インターフェイスのさまざまな実装で equals メソッドが適切に機能することが保証されます。
順序に関係なくチェックしたい場合は、すべての要素をセットにコピーし、結果のセットに対して equals を使用できます。
public static <T> boolean listEqualsIgnoreOrder(List<T> list1, List<T> list2) {
return new HashSet<>(list1).equals(new HashSet<>(list2));
}
このアプローチの制限は、順序だけでなく重複要素の頻度も無視することです。たとえば、list1
was ["A", "B", "A"] とlist2
was ["A", "B", "B"] の場合、このSet
アプローチではこれらが等しいとみなされます。
順序を気にせず、重複の頻度を気にする必要がある場合は、次のいずれかの方法を使用します。
- 比較する前に両方のリスト(またはコピー)をソートする。別の質問に対するこの答え
- またはすべての要素をマルチセット