是否基于自定义属性将用户定义的数据类型添加到Java集?

时间:2018-07-23 21:11:43

标签: java collections

说我有一个自定义数据类型:

public class Notification {
    private String name;
    private String location;
    private String message;

    // Constructors, getter, setters, etc.          
}

我想将列表中的对象(Notification类型)添加到集合中,以消除重复项。但是只是简单地将它们添加到Set中是行不通的,因为Java不知道如何检查是否存在重复项。

如何告诉Java,当我向集合中添加Notification对象时,我希望它仅检查name属性是否唯一(忽略其他字段)?

2 个答案:

答案 0 :(得分:1)

我发现,使用Louis Wasserman提到的Map(按名称属性键)比覆盖hashChode和equals更好。如果您想做我正在做的事情,则可以实现类似以下的内容:

Map<String, Notification> m = new HashMap();

    for (Notification n : notifications) {
        m.put(n.getHostname(), n);
    }

    Iterator it = m.entrySet().iterator();
    while (it.hasNext()) {
        Map.Entry pair = (Map.Entry) it.next();
        System.out.println(pair.getKey() + " = " + pair.getValue());
    }

当您遍历Map时,您会发现它根据键确定对象是否唯一!比使用Set容易得多。

答案 1 :(得分:0)

根据Set documentation,它将包含一个

  

不包含重复元素的集合。更正式地说   不包含一对元素e1e2,例如 e1.equals(e2) ,并在   最多一个null元素。顾名思义,此接口模型   数学集合抽象。

因此,我们可以看到,如果您为Notification覆盖了equals方法,则可以在此处指定如何比较两个元素(两个通知)。

我还建议您覆盖hashCode方法,以防您使用Set的实现,例如HashSet

例如,您可以使用以下内容:

public class Notification {
    private String name;
    private String location;
    private String message;

    // Constructors, getter, setters, etc.          

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (!(o instanceof Notification)) return false;
        Notification notif = (Notification) o;
        return Objects.equals(name, notif.name);
    }

    @Override
    public int hashCode() {
        return Objects.hash(name);
    }

}