说我有一个自定义数据类型:
public class Notification {
private String name;
private String location;
private String message;
// Constructors, getter, setters, etc.
}
我想将列表中的对象(Notification
类型)添加到集合中,以消除重复项。但是只是简单地将它们添加到Set中是行不通的,因为Java不知道如何检查是否存在重复项。
如何告诉Java,当我向集合中添加Notification
对象时,我希望它仅检查name
属性是否唯一(忽略其他字段)?
答案 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,它将包含一个
不包含重复元素的集合。更正式地说 不包含一对元素
e1
和e2
,例如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);
}
}