JavaListどおしの比較

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;
    }
}

コードの説明

  1. 2つのList<List<String>>のサイズを比較:
  • 入力された2つのList<List<String>>のサイズ(行数)が異なる場合は即座にfalseを返します。
  • listA.size() != listB.size() をチェックします。
  1. 各行(List)を比較:
  • listAlistBの対応する行を1つずつ取得し、List<String>.equals()メソッドを使用して一致を確認します。
  • equals()メソッドは、リスト内の全要素が一致しているかチェックします。
  1. 全ての行が一致していればtrueを返す:
  • 行ごとに全て比較し、一致が確認できた場合はtrueを返します。

実行結果

list1 と list2 が一致するか: true
list1 と list3 が一致するか: false

ポイント

  1. List.equalsの動作:
  • List.equalsは、リストのサイズと要素が全て一致している場合にtrueを返します。これを利用して簡潔に行単位の比較を行えます。
  1. 効率性:
  • このコードは、List<List<String>>のサイズとデータを逐次比較する形で動作します。リストが非常に大きい場合を考慮すると、比較対象が不必要に膨大にならないようプリチェックを行う(例: サイズや構造だけを事前に確認する)ことも有効です。
  1. オプションの方法:
  • 順序を確認せずチェックしたい場合:
    行や列の順序を気にせずに一致を確認したい場合は、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));
    }
}

この方法なら、行の順序を無視してリストが一致するかを確認できます。必要に応じて用途に合わせた方法を選んでください!

質問があれば、ぜひお知らせください! 😊

コメント

タイトルとURLをコピーしました