Javaで2つのリストが同等であるかどうかを判断することは、一般的なタスクです。リストの内容が完全に一致するかどうかを確認したい場合や、順序を問わずに要素が同じであるかどうかだけを知りたい場合があります。ここでは、Javaで2つのリストの同等性を評価するいくつかの方法を、コード例とともに紹介します。
問題定義
2つのリストがあり、それらが同等であるかを判断したいとします。ここで、2つのリストが同等であるという条件は、リストに含まれる要素の数が同じであり、かつ要素の値も同じであり、順序は考慮しないと定義します。
方法1: equals() メソッドを使用する
JavaのListインターフェースはCollectionインターフェースを継承しており、Collectionインターフェースには2つのコレクションの同等性を比較するためのequals()メソッドが定義されています。このequals()メソッドを直接使用して、2つのListが同等であるかを比較できます。
List<String> list1 = new ArrayList<>();
list1.add("apple");
list1.add("banana");
List<String> list2 = new ArrayList<>();
list2.add("apple");
list2.add("banana");
boolean isEqual = list1.equals(list2);
System.out.println("2つのリストは同等か: " + isEqual);
この例では、equals()メソッドを使用して2つのリストが同等であるかを比較しています。2つのリストの要素数と値がすべて同じであればtrueを返し、そうでなければfalseを返します。
方法2: containsAll() メソッドを使用する
リストの要素の順序を気にせず、単に2つのリストの要素が同じであるかどうかを判断したい場合は、containsAll()メソッドを使用できます。
List<String> list1 = new ArrayList<>();
list1.add("apple");
list1.add("banana");
List<String> list2 = new ArrayList<>();
list2.add("banana");
list2.add("apple");
boolean isEqual = list1.containsAll(list2) && list2.containsAll(list1);
System.out.println("2つのリストは同等か: " + isEqual);
この例では、まず一方のリストがもう一方のリストのすべての要素を含んでいるかを確認し、次にその逆も確認しています。これにより、要素の順序に関係なく、両方のリストが同じ要素のセットを含んでいることを確認できます。要素数が異なる場合もこの方法で検出されます。
方法3: Java 8 Stream API を使用する
Java 8以降では、Stream APIを使用して2つのリストの同等性を比較できます。リストをStreamに変換し、sorted()メソッドで要素をソートしてから、equals()メソッドで比較します。
List<String> list1 = new ArrayList<>();
list1.add("apple");
list1.add("banana");
List<String> list2 = new ArrayList<>();
list2.add("banana");
list2.add("apple");
boolean isEqual = list1.stream().sorted().collect(Collectors.toList())
.equals(list2.stream().sorted().collect(Collectors.toList()));
System.out.println("2つのリストは同等か: " + isEqual);
このコードでは、Stream APIを使用してリストの要素をソートしてから比較することで、リストの同等性を判断しています。これにより、順序が異なる場合でも、内容が同じであれば同等とみなされます。
完全なサンプルコード
上記3つの方法の使用法をより良く示すために、完全なサンプルコードを以下に示します。
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
public class CompareLists {
public static void main(String[] args) {
List<String> list1 = new ArrayList<>();
list1.add("apple");
list1.add("banana");
List<String> list2 = new ArrayList<>();
list2.add("banana");
list2.add("apple");
// 方法1: equals() メソッドを使用
boolean isEqual1 = list1.equals(list2);
System.out.println("方法1: 2つのリストは同等か: " + isEqual1);
// 方法2: containsAll() メソッドを使用
boolean isEqual2 = list1.containsAll(list2) && list2.containsAll(list1);
System.out.println("方法2: 2つのリストは同等か: " + isEqual2);
// 方法3: Java 8 Stream API を使用
boolean isEqual3 = list1.stream().sorted().collect(Collectors.toList())
.equals(list2.stream().sorted().collect(Collectors.toList()));
System.out.println("方法3: 2つのリストは同等か: " + isEqual3);
}
}
まとめ
この記事では、Javaで2つのリストが同等であるかどうかを比較する3つの方法を紹介しました。equals()メソッドは順序と内容の両方を考慮して比較し、containsAll()メソッドは順序を問わずに内容の一致を確認し、Java 8 Stream APIは要素をソートしてから比較することで同等性を判断します。