employeeName
メンバー変数としてとを持つ Employee というクラスがあります。新しい Employee オブジェクトを作成し、に基づいて並べ替えたい場所にemployeeId
追加しています。しかし、2つの Employee オブジェクトが同じである場合、それらは等しいと見なします。セットは重複を許可しません。しかし、ここで私は奇妙な振る舞いを観察できます。これが私のコードです (ここでは getter と setter を使用していません。メンバー変数に直接アクセスしています。)TreeSet
employeeId
employeeName
package secondOne;
import java.util.Set;
import java.util.TreeSet;
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 == this.employeeName) {
return true;
}
return false;
}
}
public class TestingSetsWithComparable {
/**
* @param args
*/
public static void main(String[] args) {
Employee e1 = new Employee("A", 1);
Employee e2 = new Employee("A", 2);
Employee e3 = new Employee("B", 3);
Set<Employee> set = new TreeSet<Employee>();
set.add(e1);
set.add(e2);
set.add(e3);
System.out.println(set);
}
}
ここで、上記のコードの出力は次のとおりです。
[Name is: A Emp id is: 1, Name is: A Emp id is: 2, Name is: B Emp id is: 3]
私の最初の質問は、equals() メソッドでは、2 つの Employee オブジェクトが同じ employeeName を持つ場合に等しいと見なしますが、compareTo メソッドでは、employeeId を使用してソートしています。この場合、出力は employeeName 'A' の 2 つのエントリを示しています。2つのオブジェクトが同じemployeeNameを持っている場合に同じであると考えると、TreeSetはどのように重複エントリを許可しますか? これはどのように可能ですか..?そして2番目の質問は、compareToメソッドで、employeeNameを使用してソートすると、同じ名前の2番目の繰り返しエントリを取得できないことです。この 2 番目のケースの出力は次のとおりです。
[Name is: A Emp id is: 1, Name is: B Emp id is: 3]
どうしてこんなに..?