JavaでList<List<String>>同士の各レコード(行)の内容が一致するかどうかを確認するコードを以下に示します。
サンプルコード:List<List<String>>同士の中身を確認する
以下では、2つのList<List<String>>を比較し、全ての行が一致している場合はtrueを返し、一致しない行があればfalseを返すプログラムを作成します。
import java.util.ArrayList;
import java.util.List;
public class CompareNestedLists {
public static void main(String[] args) {
// 1つ目のList<List<String>>
List<List<String>> list1 = new ArrayList<>();
list1.add(List.of("名前", "年齢", "職業"));
list1.add(List.of("山田太郎", "30", "エンジニア"));
list1.add(List.of("鈴木一郎", "25", "デザイナー"));
// 2つ目のList<List<String>>
List<List<String>> list2 = new ArrayList<>();
list2.add(List.of("名前", "年齢", "職業"));
list2.add(List.of("山田太郎", "30", "エンジニア"));
list2.add(List.of("鈴木一郎", "25", "デザイナー"));
// 3つ目のList<List<String>>(不一致例)
List<List<String>> list3 = new ArrayList<>();
list3.add(List.of("名前", "年齢", "職業"));
list3.add(List.of("山田太郎", "30", "エンジニア"));
list3.add(List.of("佐藤花子", "28", "マネージャー"));
// 一致確認
System.out.println("list1 と list2 が一致するか: " + areNestedListsEqual(list1, list2)); // true
System.out.println("list1 と list3 が一致するか: " + areNestedListsEqual(list1, list3)); // false
}
/**
* 2つの List<List<String>> が一致するかどうかを検証するメソッド
*
* @param listA 比較対象1
* @param listB 比較対象2
* @return true なら同じ中身、false なら異なる
*/
public static boolean areNestedListsEqual(List<List<String>> listA, List<List<String>> listB) {
// サイズが異なる場合、即座に false を返す
if (listA.size() != listB.size()) {
return false;
}
// 各行(List<String>)を比較
for (int i = 0; i < listA.size(); i++) {
if (!listA.get(i).equals(listB.get(i))) { // 行内容の一致を確認
return false;
}
}
// 全て一致する場合 true を返す
return true;
}
}
コードの説明
- 2つの
List<List<String>>のサイズを比較:
- 入力された2つの
List<List<String>>のサイズ(行数)が異なる場合は即座にfalseを返します。 listA.size() != listB.size()をチェックします。
- 各行(List)を比較:
listAとlistBの対応する行を1つずつ取得し、List<String>.equals()メソッドを使用して一致を確認します。equals()メソッドは、リスト内の全要素が一致しているかチェックします。
- 全ての行が一致していれば
trueを返す:
- 行ごとに全て比較し、一致が確認できた場合は
trueを返します。
実行結果
list1 と list2 が一致するか: true
list1 と list3 が一致するか: false
ポイント
List.equalsの動作:
List.equalsは、リストのサイズと要素が全て一致している場合にtrueを返します。これを利用して簡潔に行単位の比較を行えます。
- 効率性:
- このコードは、
List<List<String>>のサイズとデータを逐次比較する形で動作します。リストが非常に大きい場合を考慮すると、比較対象が不必要に膨大にならないようプリチェックを行う(例: サイズや構造だけを事前に確認する)ことも有効です。
- オプションの方法:
- 順序を確認せずチェックしたい場合:
行や列の順序を気にせずに一致を確認したい場合は、Set<List<String>>を使った重複のない比較を行う方法を検討します。
応用例:Setで順序を無視した比較
順序に依存しない比較方法として、Setを使うことができます。
import java.util.*;
public class CompareNestedListsUnordered {
public static void main(String[] args) {
// 1つ目と2つ目のリスト
List<List<String>> list1 = Arrays.asList(
Arrays.asList("名前", "年齢", "職業"),
Arrays.asList("山田太郎", "30", "エンジニア"),
Arrays.asList("鈴木一郎", "25", "デザイナー")
);
List<List<String>> list2 = Arrays.asList(
Arrays.asList("鈴木一郎", "25", "デザイナー"),
Arrays.asList("名前", "年齢", "職業"),
Arrays.asList("山田太郎", "30", "エンジニア")
);
System.out.println("順序無視で一致するか: " + areNestedListsEqualUnordered(list1, list2)); // true
}
private static boolean areNestedListsEqualUnordered(List<List<String>> listA, List<List<String>> listB) {
return new HashSet<>(listA).equals(new HashSet<>(listB));
}
}
この方法なら、行の順序を無視してリストが一致するかを確認できます。必要に応じて用途に合わせた方法を選んでください!
質問があれば、ぜひお知らせください! 😊

コメント