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;
}

我面临的问题是:

  1. remove 方法实际上并没有从名称中删除对象
  2. subSet 排除 fromElement 并包含 toElement

您的 compareTo 方法违反了 Comparable 的一般约定。在您的示例中考虑 emp1emp2emp1.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
}