2017-02-12 73 views
1

我有2個哈希集合,都包含x個「Names」(Object)。什麼我想要做的是找出是否在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)) {' 

從未發生過。但我想得到的輸出將是喬恩海倫。由於他們不在名稱2

+0

刪除你的!運算符來計算常用名稱。 – algojava

+3

您的'Name'類中的'equals'和'hashCode'方法是爲了簡潔還是真正缺失而被刪除? –

+2

你需要從超類中重寫'equals'和'hashCode'方法,這將是'Object'類 –

回答

0

假設你有equalshashCode方法Name類重寫,你可以使用的Set(javadoc的hereretainAll方法,找出共同的要素。例如。

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方法修改set它被稱爲上(Names1在我們的例子)。如果您想保留原始設置,則可以複製另一組中的元素,並在該實例上調用retainAll

0

您的Set::contains檢查不起作用,因爲您無法覆蓋Object::equalsObject::equals的默認實現是檢查引用相等(==),這意味着名稱必須是完全相同的實例才能被視爲相等。

正如其他人所說,你要做的正確的事情是在你的Name類中實現hashCode和equals。

如果沒有這樣做,您將不得不遍歷整個集合並測試來執行您自己的手動編碼和低效版本的Set::contains測試。