首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >比较2套Java

比较2套Java
EN

Stack Overflow用户
提问于 2017-02-12 15:57:02
回答 2查看 69关注 0票数 1

我有两个哈希集,都包含x数量的“名称”(对象)。想要做的是找出我的在 Names1 E 110名称2E 211中是否有“”?

代码语言:javascript
复制
 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;
}
}

因此,当我运行这段代码时,我根本没有输出,因为

代码语言:javascript
复制
'if (!Names2.contains(element)) {' 

从未发生过。但作为产出,我想得到的是乔恩和海伦。因为他们不在Names2。

EN

回答 2

Stack Overflow用户

发布于 2017-02-12 16:08:25

假设equalshashCode方法在Name类中覆盖,则可以使用SetretainAll方法(javadoc 这里 )来查找公共元素。例如。

代码语言:javascript
复制
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类:

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2017-02-12 16:28:15

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

正如其他人所指出的,正确的做法是在您的Name类中实现hashCode和equals。

如果做不到这一点,您将不得不遍历集合并测试obj1.getNameString().equals(obj2.getNameString()),以执行您自己编写的、效率低下的Set::contains测试版本。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42189795

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档