【Java】独自クラスのリストを比較して、値が一致してないものを取り出す

プログラムを作っていて、リスト同士を比較なんてことはよくあることだと思います。

List<String>の比較はよく見ますが、List<Class>の比較はあまり見かけず忘れてしまうのでメモとして残します。

スポンサーリンク

目的

やりたいことは、「Aクラス」と「Bクラス」が持っている色コードを比較し、異なる色コードがあった場合それを抽出する

クラスA

クラスAは、「色名」と「色コード」を持っているクラス

public class ClassA {
    private String colorName; // 色名
    private String colorCode; // 色コード
    
    
    public ClassA(String colorName, String colorCode) {
        setColorName(colorName);
        setColorCode(colorCode);
    }
  
    // getter, setterメソッドの実装は省略
}

クラスB

クラスBは、「ニックネーム」と「色コード」を持っているクラス

public class ClassB {
    private String name; // 名前
    private String colorCode; // 色コード
    
    
    public ClassB(String name, String colorCode) {
        setName(name);
        setColorCode(colorCode);
    }
  
    // getter, setterメソッドの実装は省略
}

実装

処理の大まかな流れは

  1. 両クラスに存在する色コードを抽出
  2. 一致した色コードを「removeAll」メソッドに渡して削除
  3. 一致したものは削除されているので、結果不一致のものが取得できる
public static void Main(String args[]) {
    // クラスAのリスト
    List<ClassA> classA = new ArrayList<>();
    classA.add(new classA("red", "#ff0000"));
    classA.add(new classA("blue", "#0000ff"));
    classA.add(new classA("green", "#00ff00"));
        
     // クラスBのリスト
    List<ClassB> classB = new ArrayList<>();
    classB.add(new ClassB("Yamada", "#ff0000"));
    classB.add(new ClassB("Koyama", "#0000ff"));
    classB.add(new ClassB("Sato", "#000000"));
        
    // 色名が一致してないものを取得
    classB.removeAll(classB.stream()
        .filter(x -> classA.stream().anyMatch(y -> y.getColorCode().equals(x.getColorCode())))
        .collect(Collectors.toList()));
        
    classB.forEach(x -> System.out.println(x.getName()));
    // 結果
    // >> Sato
}

※上記ソースでは、元のリストに対して「removeAll」するので、消えると困る場合は別途退避してください。

コメント

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