Java
 Computer >> コンピューター >  >> プログラミング >> Java

Javaで2つのリストを比較する方法|等価チェック・差分抽出・共通要素の取得

JavaのListインターフェースには、2つのリストを比較して共通要素や不足要素を見つけるための便利なメソッドが用意されています。この記事では、等価性のチェック、並び順を無視した比較、差分の抽出、共通要素の取得という4つのケース別に、具体的なコード例とともに解説します。

ソートされていない2つのリストの等価性を比較する

2つのリストが「同じ要素を同じインデックス位置に持つ」、つまり完全に一致しているかどうかを確認したい場合は、equals()メソッドを使用します。

import java.util.Arrays;
import java.util.List;

public class CompareTwoLists {

    public static void main(String[] args) {
        List<String> listOne = Arrays.asList("a", "b", "c");
        List<String> listTwo = Arrays.asList("a", "b", "c");
        List<String> listThree = Arrays.asList("c", "a", "b");

        boolean isEqual = listOne.equals(listTwo);
        System.out.println(isEqual);

        isEqual = listOne.equals(listThree);
        System.out.println(isEqual);
    }
}

実行結果:

true
false

ご覧のとおり、equals()メソッドは要素の値だけでなく、リスト内での位置も比較対象にします。そのため、同じ要素を含んでいても並び順が異なるlistOnelistThreeの比較結果はfalseとなります。

  • JavaでArrayListをループ処理する方法
  • リストから重複要素を削除する方法
  • Javaでリストを配列に変換する方法

2つのソート済みリストを比較する

「2つのリストは同じ要素を持っているか?」——要素の並び順は問わず、構成要素だけで等価性を判定したい場合は、Collectionsクラスのsort()メソッドで両方のリストをあらかじめソートしてから比較します。

import java.util.Arrays;
import java.util.Collections;
import java.util.List;

public class CompareTwoLists {

    public static void main(String[] args) {
        List<String> listOne = Arrays.asList("b", "c", "a");
        List<String> listTwo = Arrays.asList("a", "c", "b");
        List<String> listThree = Arrays.asList("c", "a", "b");

        Collections.sort(listOne);
        Collections.sort(listTwo);
        Collections.sort(listThree);

        boolean isEqual = listOne.equals(listTwo);
        System.out.println(isEqual);

        isEqual = listOne.equals(listThree);
        System.out.println(isEqual);
    }
}

実行結果:

true
true

ソート後にequals()で比較することで、含まれる要素が同一であれば、元の並び順に関係なくtrueが返されることがわかります。

2つのリストを比較して差分(不足要素)を見つける

Listインターフェースには、2つのリスト間の差分を検出するメソッドも用意されています。

removeAll()メソッドは、引数に渡したリストとの共通要素をすべて削除します。処理後に残るのが、呼び出し元のリストにのみ存在する要素、すなわち相手側のリストに「不足している」項目です。

たとえば、listOnelistTwoを比較して「listTwoに存在しない要素」を調べたい場合は、次のように記述します。

import java.util.ArrayList;
import java.util.Arrays;

public class CompareTwoArrayLists {

    public static void main(String[] args) {
        ArrayList<Integer> listOne = new ArrayList<>(Arrays.asList(1, 2, 3, 4, 5));

        ArrayList<Integer> listTwo = new ArrayList<>(Arrays.asList(1, 2, 4, 5, 6, 7));

        listOne.removeAll(listTwo);

        System.out.println("listTwoに存在しない要素: " + listOne);
    }
}

実行結果:

listTwoに存在しない要素: [3]

同様に、呼び出し元を逆にすれば、listOneに存在しない要素を抽出できます。

listTwo.removeAll(listOne);

System.out.println("listOneに存在しない要素: " + listTwo);

実行結果:

listOneに存在しない要素: [6, 7]

2つのリストを比較して共通要素を見つける

retainAll()メソッドは、両方のリストに共通して存在する要素だけを残します。数学でいう積集合(AND)を求めるイメージです。

public class CompareTwoArrayLists {

    public static void main(String[] args) {
        ArrayList<Integer> listOne = new ArrayList<>(Arrays.asList(1, 2, 3, 4, 5));

        ArrayList<Integer> listTwo = new ArrayList<>(Arrays.asList(1, 2, 4, 5, 6, 7));

        listOne.retainAll(listTwo);

        System.out.println("両リストの共通要素: " + listOne);
    }
}

実行結果:

両リストの共通要素: [1, 2, 4, 5]

まとめ:使い分けのポイント

最後に、各メソッドの役割を整理しておきます。

  • equals():要素とその順序を含めて完全一致するかを判定
  • sort() + equals():順序を無視して、構成要素が同じかを判定
  • removeAll():片方のリストにしかない要素(差分)を抽出
  • retainAll():両方のリストに共通する要素だけを抽出

なお、removeAll()retainAll()は元のリスト自体を書き換える破壊的なメソッドです。元のデータを保持しておきたい場合は、new ArrayList<>(list)のようにコピーを作成してから操作すると安全です。

  1. Javaで2つの画像を比較する方法:RGB差分から類似度をパーセンテージで算出

    2つの画像を比較する手順 Javaで2枚の画像を比較し、その差分をパーセンテージとして求めるには、以下の手順に従います。 ImageIO.read() メソッドを使って、比較対象となる2枚の画像を読み込みます。 それぞれの画像の幅と高さを取得し、両者のサイズが一致しているかを確認します。 各画像のピクセル値を取得し、そこからRGB(赤・緑・青)の各値を取り出します。 2枚の画像の対応するピクセル同士のRGB値の差をすべて合計します。 次の式を使って、差分の割合(パーセンテージ)を計算します。 Average = difference / (width × height × 3); Perc

  2. Excelで2つの列やリストを比較する方法|初心者にもわかる4つの基本テクニック

    Excelで作業をしていると、2つ以上の列の一致や相違を確認したい場面によく出くわします。列同士の比較自体は難しくありませんが、方法が多数あるため、どれを選べばよいか迷ってしまうこともあるでしょう。この記事では、Excelで列を照合・比較するためのさまざまなテクニックを、具体例とともにわかりやすく解説します。 Excelで2つの列またはリストを比較する4つの方法 ここでは、スーパーマーケットの2つのショールームの商品名が入力された2列のデータセットを用意しました。この2つのショールームのデータを比較していきます。 方法1:等号演算子(=)を使って2つの列を比較する まずは、等号(=)を使って