フォーラムでこの質問に答えようとしたところequals
、クラスでメソッドをオーバーライドしたにもかかわらず、Employee
重複した要素をTreeSet
.
TreeSet.add(E)メソッドのJavadocは言う
指定された要素がまだ存在しない場合は、このセットに追加します。より正式には、(e==null ? e2==null : e.equals(e2)) となる要素 e2 がセットに含まれていない場合、指定された要素 e をこのセットに追加します。このセットにすでに要素が含まれている場合、呼び出しはセットを変更せずに false を返します。
これは基本的に、2 つの等しいオブジェクトが挿入されず、含まれているオブジェクトのメソッドTreeSet
によってのみ等しいかどうかが決定されることを意味します。equals()
ただし、以下のコードは、Set
等しいにもかかわらず に2 つの要素を追加しています。
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
等しい場合でも複数の要素を許可するのはなぜですか?
今、私はこのようなcompareTo
方法を変更しましたEmployee
public int compareTo(Employee emp) {
return this.employeeName.compareTo(emp.employeeName);
}
そして、出力は
true
[Name is: A Emp id is: 1]
TreeSet
オーバーライド後、どのように適切に動作しますcompareTo
か?