SortedSet не работает согласно документации - PullRequest
2 голосов
/ 22 марта 2020

У меня есть два примера кода ниже. пожалуйста, просмотрите их и помогите мне обнаружить ошибку

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 ( "ти"); возвращает 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);

Класс Employee имеет имя, дату найма и emp emp в качестве полей. он реализует интерфейс Comparable, а метод 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

1 Ответ

4 голосов
/ 22 марта 2020

Ваш compareTo метод нарушает общий контракт Comparable. Рассмотрим emp1 и emp2 в вашем примере. emp1.compareTo(emp2) вернет -1, но emp2.compareTo(emp1) также вернет -1.

Вы можете исправить это, сравнивая идентификаторы, а не просто проверяя, что они равны, что должно заставить ваш набор работать должным образом:

@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
}
...