У меня есть класс 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, похоже, больше не является отсортированным набором.Я могу ошибиться, но, к сожалению, я не могу отследить этот момент из-за сложности моей программы.
Спасибо.