SortedSet 不按照文档工作
SortedSet not working as per documentation
下面有两个示例代码。请检查它们并帮助我找出错误
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);
这里的输出非常好。 names.remove("ti"); return true 和范围视图还包括 fromElement 并排除 toElement
但是如果我在排序集中存储一个 Employee 对象,remove 不会删除该元素,并且范围视图显示排除了 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);
员工 class 有姓名、雇用日期和员工 ID 作为字段。它实现 Comparable 接口和 compareTo 方法在 hireday 进行比较,并处理相等的情况。
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)
会 return -1
,但 emp2.compareTo(emp1)
也会 return -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
}
下面有两个示例代码。请检查它们并帮助我找出错误
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);
这里的输出非常好。 names.remove("ti"); return true 和范围视图还包括 fromElement 并排除 toElement
但是如果我在排序集中存储一个 Employee 对象,remove 不会删除该元素,并且范围视图显示排除了 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);
员工 class 有姓名、雇用日期和员工 ID 作为字段。它实现 Comparable 接口和 compareTo 方法在 hireday 进行比较,并处理相等的情况。
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)
会 return -1
,但 emp2.compareTo(emp1)
也会 return -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
}