【发布时间】:2013-06-02 22:34:39
【问题描述】:
我已经向 TreeSet 添加了一些简单的对象,但是当我调用 TreeSet 的 remove() 和 contains() 方法时,它们不起作用。但是,当我遍历集合时,会打印对象。员工对象应添加到集合中,而对象的唯一性基于对象名称属性。 Id 属性是应该排序的值,但它不是唯一的。
public class Employee {
private String name;
private int id;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
// Two objects are considered equal if their names are equal
@Override
public boolean equals(Object o) {
if (o == null)
return false;
if (this == o)
return true;
if (o.getClass() == this.getClass()) {
Employee p = ( Employee) o;
if (p.getName() != null && this.getName() != null)
return this.getName().equals(p.getName());
else
return false;
} else {
return false;
}
}
}
//*******************************************************
public class EmployeeComp implements Comparator<Employee> {
// Sort Ids, but allow duplicates, hence this function is never returning 0
@Override
public int compare(Employee p1, Employee p2) {
int re = 0;
boolean scoreLt = (p1.getId() > p2.getId());
boolean scoreGt = (p1.getId() < p2.getId());
if(scoreLt)
re = -1;
if(scoreGt)
re = 1;
else
re = -1;
return re;
}
}
//*******************************************************
// Collection shall store unique names with ordered values like:
// Alex, 923
// Toni, 728
// Eddi, 232
// Peter, 232
// Eddi, 156 *** not allowed
import java.util.TreeSet;
public class Main {
private static EmployeeComp comp = new EmployeeComp();
private static TreeSet<Employee> employees = new TreeSet<Employee>(comp);
public static void main(String[] args) {
Employee p1 = new Employee();
p1.setName("Eddi");
p1.setId(232);
Employee p2 = new Employee();
p2.setName("Toni");
p2.setId(728);
Employee p3 = new Employee();
p3.setName("Peter");
p3.setId(232);
Employee p4 = new Employee();
p4.setName("Alex");
p4.setId(923);
employees.add(p1);
employees.add(p2);
employees.add(p3);
employees.add(p4);
// Here, contains() and remove() should check the object address
// and not perform their actions based on compareTo
}
}
【问题讨论】:
-
不,我先做了,后来注释掉了,所以这不是原因。
-
@fge 当然,你说得对,我忽略了这一点。
-
好的,看看解决方案,还有一件事你必须记住:你不能单独使用
.equals()/.hashCode()或Comparator做你想做的事——你不能同时拥有你的蛋糕吃吧。我的BigDecimal例子应该已经给你提示了! -
注意我的解决方案:还有一个使用 Guava 的
Equivalence,我个人更喜欢它;并且由于会使用番石榴,这意味着您将获得Ordering作为奖励
标签: java collections set