下面有两个示例代码。请检查它们并帮助我发现错误
SortedSet<String> names = new TreeSet<>();
names.add("ar");
names.add("aj");
names.add("ka");
names.add("ru");
names.add("ti");
System.out.println(names);
SortedSet<String> rangeView;
rangeView = names.subSet("ar", "ti");
System.out.println("flag is "+names.remove("ti"));
System.out.println(rangeView);
System.out.println(names);
这里的输出非常好。名称.删除(“ti”);返回 true 并且范围 View 还包括 fromElement 并排除 toElement
但是,如果我在排序集中存储 Employee 对象,删除 不会删除该元素,并且范围 View 显示 fromElement 被排除而 toElement 被包含
这是代码片段
Employee emp1 = new Employee("aj", LocalDate.parse("2019-09-20"), "57764");
Employee emp2 = new Employee("ar", LocalDate.parse("2016-06-20"), "5324");
Employee emp3 = new Employee("ka", LocalDate.parse("2017-07-21"), "2809");
Employee emp4 = new Employee("ru", LocalDate.parse("2018-08-12"), "2765");
Employee emp5 = new Employee("ti", LocalDate.parse("2018-08-12"), "2762");
SortedSet<Employee> names = new TreeSet<>();
names.add(emp1);
names.add(emp2);
names.add(emp3);
names.add(emp4);
names.add(emp5);
System.out.println(names);
SortedSet<Employee> rangeView;
rangeView = names.subSet(emp3, emp1);
System.out.println("flag is "+names.remove(emp5));
System.out.println(rangeView);
System.out.println(names);
员工类别具有姓名、雇用日期和员工 ID 作为字段。它实现了 Comparable 接口(interface),compareTo 方法在雇佣日进行比较,并处理 equals 情况。
compareTo 方法粘贴在下面:
@Override
public int compareTo(Employee second) {
int compareFlag = this.getHireday().compareTo(second.getHireday());
if(compareFlag!=0){
return compareFlag;
}
return this.getEmpid().equals(second.getEmpid()) ? 1:-1;
}
我面临的问题是:
- remove 方法实际上并没有从名称中删除对象
- subSet 排除 fromElement 并包含 toElement
最佳答案
您的 compareTo
方法违反了 Comparable
的一般契约。在您的示例中考虑 emp1
和 emp2
。 emp1.compareTo(emp2)
将返回 -1
,但 emp2.compareTo(emp1)
也会返回 -1
>。
您可以通过比较 id 而不是仅仅检查它们是否相等来解决此问题,这应该使您的设置按预期工作:
@Override
public int compareTo(Employee second) {
int compareFlag = this.getHireday().compareTo(second.getHireday());
if (compareFlag != 0) {
return compareFlag;
}
return this.getEmpid().compareTo(second.getEmpid()); // Here
}
关于java - SortedSet 无法按照文档工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60800757/