我有2个哈希集,都包含x数量的“名称”(对象)。我想做的是找出Names1或Names2中的“名称”吗?

 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)) {'


从来没有发生。但是我希望得到的输出是乔恩和海伦。由于它们不在Names2中。

最佳答案

假设您在equals类中重写了hashCodeName方法,则可以使用retainAllSet方法(javadoc here)来查找常见元素。例如。

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方法的Name类示例:

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

关于java - 比较2套Java,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42189795/

10-10 10:00