2017-12-27 7 views
-5

重複したオブジェクトを削除するために、2つのオブジェクト配列を使用しています。どのように重複を削除するオブジェクトの2つの配列を比較するには?

私はClass1.java

String name; 
String number; 

の配列1を持っている私は、以下のようなオブジェクトを追加しました:

list1.add(new Class1("name1","number1")); 
list1.add(new Class1("name2","number2")); 
list1.add(new Class1("name3","number3")); 
list1.add(new Class1("name4","number4")); 

list2.add(new Class1("name1","number1")); 
list2.add(new Class1("name5","number2")); 
list2.add(new Class1("name6","number3")); 
list2.add(new Class1("name2","number4")); 

今私は名前を基準にリスト1とリスト2を比較したいです。

HashMap店一意のキーを、自分から任意のフィールド(ユニークな値)を選択します。私は1つのリストに、両方のリストを結合し、カスタム関数の下にそれを送信リストで2

+2

HashSetを使用しようとしましたか? –

+0

私は単一のarraylistと一緒に試みました。 – basha

+0

リスト2にあるリスト1の要素を削除しますか? –

答えて

0

を比較した後、リスト1から重複要素を削除するにはどうすればよい そのフィールド値をキーとしてHashMapに、クラスオブジェクトをvalueとして設定します。

private List<Class1> clearListFromDuplicateFirstName(List<Class1> combineList) { 

    Map<String, Class1> cleanMap = new LinkedHashMap<String, Class1>(); 
    for (int i = 0; i < combineList.size(); i++) { 
      cleanMap.put(combineList.get(i).getname(), combineList.get(i)); 
    } 

    return new ArrayList<Class1>(cleanMap.values());; 
} 
+0

があなたを試してアップデートします。 – basha

2

あなたはremoveAllメソッドを使用してlist2上に存在するlist1の要素を削除することができます。まず、あなたは自分のクラスのequalsとhashCodeメソッドをオーバーライドする必要があります:要素を削除した後

list1.add(new Class1("name1","number1")); 
list1.add(new Class1("name2","number2")); 
list1.add(new Class1("name3","number3")); 
list1.add(new Class1("name4","number4")); 

list2.add(new Class1("name1","number1")); 
list2.add(new Class1("name5","number2")); 
list2.add(new Class1("name6","number3")); 
list2.add(new Class1("name2","number4")); 

list1.removeAll(list2); 

list1

@Override 
public boolean equals(Object o) { 
    if (this == o) return true; 
    if (!(o instanceof Class1)) return false; 

    Class1 class1 = (Class1) o; 

    return name.equals(class1.name); 
} 

@Override 
public int hashCode() { 
    return name.hashCode(); 
} 

はその後の要素を追加した後、ちょうど方法このようなremoveAllを使用

[Class1 {name = 'name3'}、Class1 {name = 'name4'}]

equalshashCodeを上書きせずにEDIT

別の方法は、(ジャワ8以降で利用可能)removeIf方法を使用している:

ここ
list1.removeIf(c -> list2.stream() 
        .map(Class1::getName) 
        .anyMatch(n -> n.equals(c.getName()))); 

Iは、その名前に等しいlist1上の各要素を削除してい要素の名前はlist2です。

+0

ありがとう、それは私のために働いた。アップアップあなたのため – basha

+0

クール。今度は[この回答を受け入れる](https://stackoverflow.com/help/accepted-answer)することができます。 –

関連する問題