プログラムを作っていて、リスト同士を比較なんてことはよくあることだと思います。
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メソッドの実装は省略
}
実装
処理の大まかな流れは
- 両クラスに存在する色コードを抽出
- 一致した色コードを「removeAll」メソッドに渡して削除
- 一致したものは削除されているので、結果不一致のものが取得できる
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」するので、消えると困る場合は別途退避してください。
コメント