java - 比较2套Java

标签 java list set

我有 2 个哈希集,都包含 x 数量的“名称”(对象)。 我想要做的是查明我的“Names”是在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)) {' 

从未发生过。但我希望得到的输出是 JonHelen。因为它们不在Names2中。

最佳答案

假设您在 Name 类中重写了 equalshashCode 方法,则可以使用 SetretainAll 方法 (javadoc here ) 来查找公共(public)元素。例如

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/

相关文章:

java - 无法在mysql中使用spring data jpa创建表

java - 什么是NullPointerException,我该如何解决?

java - 通过 ObjectOutputStream 发送文件然后将其保存在 Java 中?

python - 可以在 Python 中创建非常大的元组吗?

python - 在 Python 中维护访问计数排序列表的有效方法

java - 仅将集合的一部分放入数组中

javascript - 如何为 JavaScript Set 自定义对象相等性

java - 如何下载Android Studio的包?

c# - 如何创建一个动态List<List<string>>?

python - 如何保存一个独特的听写包?