2016-03-21 18 views
0

同じ名前で異なる年齢(値)のオブジェクトが2つありますが、これらのオブジェクトをマップに追加して重複を削除しようとしましたが、削除されません。異なる変数を含む重複オブジェクトの削除

package teeestserrr; 

public class two { 

private String name; 
private String age; 

public two(String name, String age){ 
    this.age = age; 
    this.name = name; 
} 

public String getName(){ 
    return name; 
} 

public String getAge(){ 
    return age; 
} 

public String toString(){ 
    return name + " " + age; 
} 
} 

結果は次のとおりです:

[john, chan, john] 
[chan, john, john] 

私も作ってみました。これは、オブジェクトタイプのために使用されるクラスがある

two ab = new two("john", "20"); 
two ac = new two("chan", "30"); 
two ad = new two("john", "34"); 

ArrayList<two> ae = new ArrayList<>(); 

public void adding(){ 
ae.add(ab); 
ae.add(ac); 
ae.add(ad); 
System.out.println(ae); 
} 

public void removeDuplicate(){ 
    Set<two> lhs = new HashSet<>(); 
    lhs.addAll(ae); 
    ae.clear(); 
    ae.addAll(lhs); 
    System.out.println(ae); 
} 

public static void main(String args[]){ 

    one five = new one(); 

    five.adding(); 
    five.removeDuplicate(); 
} 

:これは私がテストしていたモデルのコードですtoStringは名前だけを返しますが、重複を削除するために使用されるマップはそのような場合でも機能していないようです。私は理解していないし、根本的な問題を特定することはできません。どんな助けもありがとうございます。

+0

クラス 'two'で' equals'と 'hashCode'をオーバーライドする必要があります – Eran

+0

Eranです。 HashSetはその操作のために2つのメソッドに依存しています(したがって、HashSetという名前)。これらの2つの方法の実装方法に関するガイダンスを見つけるには、お気に入りの検索エンジンを使用してください。それはあなたのIDEがあなたのためにそれらを生成することさえできるかもしれません。 –

答えて

0

equalshashcodeメソッドをtwoに上書きする必要があります。 等しい値はnameフィールドのみに従う必要があります。また、nameフィールドのみを使用してハッシュコードを構成すると、目的を達成するのに役立ちます。

package teeestserrr; 

public class two { 

    private String name; 
    private String age; 

    public two(String name, String age){ 
     this.age = age; 
     this.name = name; 
    } 

    public String getName(){ 
     return name; 
    } 

    public String getAge(){ 
     return age; 
    } 


    public String toString(){ 
     return name + " " + age; 
    } 

    @Override 
    public boolean equals(Object obj){ 
     if(obj==null) 
      return false; 
     if(name==null){ 
      return false; 
     } 
     if(!(obj instanceof two)){ 
      return false; 
     } 
     two another = (two)obj; 
     return this.name.equals(another.name); 
    } 

    public int hashCode(){ 
     return name==null?0:name.hashCode(); 
    } 
} 
+0

オブジェクトタイプ2ではなくオブジェクトタイプを文字列に変更すると、同じ方法を使用できますか? – QQQ

+0

あなたのコード 'Set lhs = new HashSet <>();'は、ハッシュの仕組みに作用するハッシュセットを使います。カスタムオブジェクトがここに渡されるので、カスタムクラスの 'equals'と' hashcode'をオーバーライドする必要があります。 –

+0

@Vittal Kavitakeには重複を取り除く別の方法がありますか?私は等号とハッシュコードをオーバーライドする方法がわかりません:(私に例を教えてもらえますか?) – QQQ

関連する問題