Java 分拣集未按照文件要求工作

Java 分拣集未按照文件要求工作,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.subSe

下面我有两个示例代码。请复习一下,帮我找出错误

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);
我面临的问题是:

  • remove方法实际上并不从名称中删除对象
  • 子集排除fromElement并包含toElement

  • 您的
    compareTo
    方法违反了
    Comparable
    的一般合同。在您的例子中考虑<代码> EMP1和<代码> EMP2。code>emp1.compareTo(emp2)将返回
    -1
    ,但
    emp2.compareTo(emp1)
    也将返回
    -1

    您可以通过比较ID来解决此问题,而不只是检查它们是否相等,这将使您的设置按预期工作:

    @覆盖
    公共整数比较(员工秒){
    int compareFlag=this.getHireday().compareTo(second.getHireday());
    如果(比较滞后!=0){
    返回比较滞后;
    }
    返回此.getEmpid().compareTo(second.getEmpid());//此处
    }
    
    您的
    员工是否正确实施了
    equals
    hashCode
    ?不,我没有实施这两项。但是ot将如何影响子集和移除方法?您是否仍将员工从aj转移到ti?如果是这样,ti在hireday的aj之前-我还没有检查树状图源代码,但这可能解释了问题2。我建议提及
    等于
    方法应该与
    比较一致,也可以使
    分类集
    正常工作。@Mureinik感谢您的快速回复。我花了两个小时来找出错误。我永远也解决不了这件事。。。坦率地说,我甚至不知道我违反了合同。我想我会的suffice@tin_tin,不是。应该有三个:
    等于
    哈希码
    比较
    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);
    
    @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;
    }