比较2套Java集合

问题描述:

我有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'类 –

假设你有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

您的Set::contains检查不起作用,因为您无法覆盖Object::equalsObject::equals的默认实现是检查引用相等(==),这意味着名称必须是完全相同的实例才能被视为相等。

正如其他人所说,你要做的正确的事情是在你的Name类中实现hashCode和equals。

如果没有这样做,您将不得不遍历整个集合并测试来执行您自己的手动编码和低效版本的Set::contains测试。