我試圖在論壇中回答this問題,我發現儘管覆蓋Employee
類中的equals
方法,但我仍然可以向TreeSet
添加重複元素。TreeSet違反設置合同?
TreeSet.add(E)方法的Javadoc說
將指定元素添加到這個組,如果它不是已存在。 更正式地說,如果集合 不包含元素e2使得(e == null?e2 == null:e.equals(e2)),則將指定元素e添加到該集合。 如果此集合已包含該元素,則該呼叫將保持集合 不變,並返回false。
這基本上意味着沒有2等於對象將被插入到TreeSet
中並且等式僅由equals()
確定包含對象的方法。
但是,下面的代碼是增加2元至Set
,即使他們是平等的
public class Employee implements Comparable<Employee> {
String employeeName;
int employeeId;
public Employee(String name, int id) {
this.employeeName = name;
this.employeeId = id;
}
public int compareTo(Employee emp) {
//return this.employeeName.compareTo(emp.employeeName);
return (this.employeeId - emp.employeeId);
}
@Override
public String toString() {
return ("Name is: " + employeeName + " Emp id is: " + employeeId);
}
@Override
public boolean equals(Object emp) {
if(emp instanceof Employee &&((Employee)emp).employeeName.equals(this.employeeName)){
return true;
}
return false;
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Set<Employee> set = new TreeSet<Employee>();
Employee e1 = new Employee("A", 1);
Employee e2 = new Employee("A", 2);
System.out.println(e1.equals(e2));
set.add(e1);
set.add(e2);
System.out.println(set);
}
}
,這裏是輸出
true
[Name is: A Emp id is: 1, Name is: A Emp id is: 2]
爲什麼TreeSet
因此即使他們是多個元素等於?
現在我改變了Employee
的compareTo
方法這樣
public int compareTo(Employee emp) {
return this.employeeName.compareTo(emp.employeeName);
}
,輸出是
true
[Name is: A Emp id is: 1]
如何TreeSet
覆蓋compareTo
後正常工作?
謝謝你指出正確的javadoc。 – sanbhat
@sanbhat也在'SortedSet'中指定,'TreeSet'實現'SortedSet'。 –
感謝@LuiggiMendoza我最初找不到它......我正在尋找由一組維護的**排序(不管是否提供了明確的比較器)必須與等於一致** – sanbhat