我有一个名为Employee的类,它具有employeeName和employeeId作为其成员变量.我正在创建新的Employee对象,然后将其添加到TreeSet我想要根据它对其进行排序的位置employeeId.但我认为2个Employee对象如果相同则相等employeeName.设置不允许重复.但在这里我可以观察到一种奇怪的行为.这是我的代码.(我不是在这里使用getter和setter.我直接访问成员变量.)
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);
}
}
Run Code Online (Sandbox Code Playgroud)
这里上面代码的输出是,
[Name is: A Emp id is: 1, Name is: A Emp id is: 2, Name is: B Emp id is: 3]
我的第一个问题是,在equals()方法中,如果他们有相同的employeeName,我认为2个Employee objests是相等的但是在compareTo方法中,我使用employeeId进行排序.在这种情况下,输出显示employeeName'A'的2个条目.当我认为2个对象具有相同的employeeName时,TreeSet如何允许重复条目.这怎么可能..?第二个问题是,在compareTo方法中,如果我使用employeeName进行排序,那么我不会得到同名的第二个重复条目.第二种情况的输出是
[Name is: A Emp id is: 1, Name is: B Emp id is: 3]
为什么会这样..?
问题出在这里:
((Employee)emp).employeeName== this.employeeName
Run Code Online (Sandbox Code Playgroud)
你必须比较String使用equals方法:
((Employee)emp).employeeName.equals(this.employeeName)
Run Code Online (Sandbox Code Playgroud)
此外,由于你是覆盖equals方法,如果你重写hashCode方法也是好的,如Object#equals合同中所述:
请注意,通常需要在重写此方法时覆盖hashCode方法,以便维护hashCode方法的常规协定,该方法声明相等对象必须具有相等的哈希代码.
附加:自您使用以来TreeSet,它将使用compareTo方法而不是equals和hashCode方法.这是因为TreeSet实现SortedSet接口.参考SortedSetjavadoc(强调我的):
一个集合,进一步提供其元素的总排序.元素使用它们的自然顺序(即实现
Comparable<T>)Comparator来排序,或者通过在排序集创建时通常提供.
您应该根据您的需要实现此方法:
public int compareTo(Employee emp) {
if (this.employeeName.equals(emp.employeeName)) {
return 0;
}
//removed the comparison by subtraction since it will behave wrongly on int overflow
return new Integer(this.employeeId).compareTo(emp.employeeId);
}
Run Code Online (Sandbox Code Playgroud)
由于您正在比较字符串,我建议使用Apache Commons Lang中的StringUtils类,它提供帮助方法以避免检查和其他.null
| 归档时间: |
|
| 查看次数: |
11788 次 |
| 最近记录: |