Удаление элементов из TreeSet с собственным Comparator, автоматическая сортировка в TreeSet - PullRequest
1 голос
/ 15 мая 2019

У меня есть класс A, экземпляры которого имеют 8 атрибутов, два последних имеют тип "int".Я реализовал интерфейс Comparator, где элементы должны сравниваться в соответствии с 7. атрибутом.Если значения атрибута 7. равны, объект должен сравниваться дополнительно по атрибуту 8., значения которого не могут быть равны.Я построил TreeSet с этим компаратором в конструкторе в другом классе.При работе с этим TreeSet я встречаюсь с неожиданным поведением.

compare () реализован следующим образом:

// class AComparator

public int compare(A a1, A a2) {
  int result = a1.get7attriibute() - a2.get7attribute();
  if (result == 0) {
    return a1.get8attribute() - a2.get8attribute();
  } else {
    return result;
  }
}

TreeSet инициализируется следующим образом:

TreeSet<A> ts = new TreeSet<A>(new AComparator());

Позже вкод Я использую следующую BiFunction:

BiFunction<A,A,A> funName = (v,u) -> {
  return v.get8attribute() > u.get8Attribute() ? v : u;
}

Использование функции выглядит следующим образом:

A result = funName.apply(a1,a2); // where a1 and a2 from the TreeSet

Использование

ts.remove(result);

позже в коде я ожидаю, что программаудалить результат из TreeSet.Однако в отладчике я вижу, что результат имеет отличный идентификатор от a1 и a2, поэтому все a1, a2 и result - это три разных объекта.Зачем?Зайдя глубоко в отладчик, я вижу, что в этой строке "ts.remove (result)" мой отладчик переходит в мой реализованный AComparator.Почему и для чего?На данный момент я не могу понять, повреждена ли моя реализация, или объяснить, почему элемент не был удален из набора, и программа переходит к моему AComparator.

Второй момент - остаются ли элементы TreeSet отсортированными, если я изменю значение 7. атрибута уже существующего элемента?Я заметил, что добавленные элементы добавляются с сортировкой, но я не упомянул, что изменение значения атрибута 7. влияет на положение элементов в TreeSet, поэтому TreeSet, похоже, больше не является отсортированным набором.Я могу ошибиться, но, к сожалению, я не могу отследить этот момент из-за сложности моей программы.

Спасибо.

...