2017-01-26 16 views
2

id: Stringname: Stringフィールドを持つオブジェクトがあります。javaリストから同じ値を持つオブジェクトを削除する方法

これらのオブジェクトの配列がある場合、技術的にオブジェクトポインタが異なるため、removeメソッドを使用すると、必要なオブジェクトは削除されません。

例:

List<ObjectA> newList = new ArrayList<>(); 
// Objecta1(id: a, name: a) 
// Objecta2(id: b, name: b) 
// Objecta3(id: b, name: b) 
newList.add(objecta1); 
newList.add(objecta2); 
newList.remove(objecta3); --> will equal false 

削除が正常にこれを行う持っているクリーンな方法は何ですか?

私が検索したところ、removeIfを使用して比較を行うことができました。また、イテレータを使用して、フィールドを自分で比較することもできます。 Javaで標準的でクリーンな方法があるかどうか疑問に思うだけです。ありがとう。

+7

ん ' ObjectA'は 'equals()'をオーバーライドしますか? – Eran

+0

@エラン - ねえ、それは私がやっていることだと思っていた。私はそれがこれを構造化する最もクリーンな方法であるかどうか疑問に思っていましたか? –

+0

はい、カスタム比較などの代わりにequalsメソッドを使用する必要があります。結局のところ、2つのオブジェクトが等しいとみなされるべきかどうかをチェックしています。とにかくequalsをオーバーライドする必要があります。多くの方法がそれを使用しています。 – qxz

答えて

3

あなたの目的は@Overrideequalsの方法である必要があります。

あなたのクラスに以下を追加します。

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

    ObjectA objectA = (ObjectA) o; 

    if (getId() != objectA.getId()) return false; 
    return getName() != null ? getName().equals(objectA.getName()) : objectA.getName() == null; 

} 

@Override 
public int hashCode() { 
    int result = getId(); 
    result = 31 * result + (getName() != null ? getName().hashCode() : 0); 
    return result; 
} 

をしてから:ソリューション・オーバーライドequals

while(newList.remove(objecta3)){}; 
+1

hashcodeメソッドもオーバーライドする必要がありますか? –

3

を、あなたは、Java 8でそれを行うことができます。

newList.removeIf(p -> p.getId().equals(objecta3.getId())); 
関連する問題