java - SortedSet 无法按照文档工作

标签 java sortedset

下面有两个示例代码。请检查它们并帮助我发现错误

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

我面临的问题是:

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

最佳答案

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

相关文章:

java - 无法将独立的 JBoss AS7 实例配置为可从外部网络访问

java - 压缩的 SortedSet<Long> 实现

java - 为什么SortedSet接口(interface)中指定的是subSet方法而不是Set?

java - GSON:使用 java.util.TreeSet 序列化对象

java - Java 中的 SortedSet 迭代

java - ObjectInputStream 导致崩溃

java - 休息客户端异常 : Could not write request: no suitable HttpMessageConverter found for request type

java - getResponseCode 抛出 NPE

java - 如何在用户不活动后关闭 JFrame?

node.js - Redis:按分数排序的集合的交集