2017-02-12 12 views
1

2つのハッシュセットがあり、両方とも「名前」(オブジェクト)がx個入っています。私「名前」 Names1またはNames2中かどうかを調べるどう私がやりたいのですか?私はこのコードを実行したときに2組のJavaを比較する

public static void main (String[] args) { 

Set<Name> Names1 = new HashSet<Name>(); 
    Names1.add(new Name("Jon")); 
    Names1.add(new Name("Mark")); 
    Names1.add(new Name("Mike")); 
    Names1.add(new Name("Helen")); 
    Set<Name> Names2 = new HashSet<Name>(); 
    Names2.add(new Name("Mark")); 
    Names2.add(new Name("Mike")); 
    Names2.add(new Name("Sally")); 



    Set<Name> listCommon = new HashSet<Name>(); 

    for (Name element : Names1) { 
     if (!Names2.contains(element)) { 
      listCommon.add(element); 
     } 
    } 

    for (Name element : listCommon) { 
     System.out.println(element.getNameString()); 
    } 

} 
public class Name { 
String ord; 

Name(String ord1){ 
    ord = ord1; 
} 

public String getNameString(){ 
    return ord; 
} 
} 

だから、私は

'if (!Names2.contains(element)) {' 

が発生したことはありません原因、まったくの出力を得ませんでした。しかし、私が出力として得たいものはJonHelenです。彼らはに属していないので、名前2です。あなたはNameクラスでオーバーライドequalshashCodeメソッドを持っていると仮定すると

+0

あなたを削除してください!演算子を使用して共通名を計算します。 – algojava

+3

あなたの 'Name'クラスの' equals'メソッドと 'hashCode'メソッドは、簡潔さのために削除されましたか、本当に欠けていますか? –

+2

'equals'メソッドと' hashCode'メソッドを 'Object'クラスとなるスーパークラスからオーバーライドする必要があります –

答えて

0

、あなたは共通の要素を見つけるためにSet(javadocのhere)のretainAllメソッドを使用することができます。例えば。

public static void main(String[] args) throws IOException { 
    Set<Name> Names1 = new HashSet<Name>(); 
    Names1.add(new Name("Jon")); 
    Names1.add(new Name("Mark")); 
    Names1.add(new Name("Mike")); 
    Names1.add(new Name("Helen")); 
    Set<Name> Names2 = new HashSet<Name>(); 
    Names2.add(new Name("Mark")); 
    Names2.add(new Name("Mike")); 
    Names2.add(new Name("Sally")); 

    Names1.retainAll(Names2); 

    for(Name name : Names1){ 
     System.out.println(name.getName()); 
    } 
} 

ここequalshashCodeメソッドを持つ例名称クラスの:

class Name{ 
    private String name; 

    public Name(String name){ 
     this.name = name; 
    } 

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

    @Override 
    public boolean equals(Object o){ 
     return o instanceof Name 
       && ((Name)o).name != null 
       && this.name != null 
       && ((Name)o).name.equals(this.name); 
    } 

    public String getName() { 
     return name; 
    } 
} 

retainAll方法は、それが(私たちの場合はNames1)に呼び出されていますsetを変更することに注意してください。元のセットを保持したい場合は、そのエレメントを別のセットにコピーし、そのインスタンスでretainAllを呼び出すことができます。

0

Object::equalsを上書きできなかったため、Set::containsのチェックは機能しません。 Object::equalsのデフォルトの実装では、参照の等価性(==)をチェックしています。これは、名前が、同じと見なされる同一のインスタンスでなければならないことを意味します。

他にも述べたように、正しいことはNameクラスにhashCodeとequalsを実装することです。

これを失敗した場合は、Set::containsテストの手作業でコード化された非効率的なバージョンを実行するには、セットを反復してテストしてください。

関連する問題