Вы, наверное, знаете, что если a-b=c
, то b-a=-c
.
То, что здесь происходит, очень похоже.Похоже, вы предположили, что TreeSet
вызывает метод compare
следующим образом:
comparator.compare(s1, s2)
(Обратите внимание, что я использовал s1
и s2
в демонстрационных целях. Они явно не входят в сферу примененияв TreeSet
. s1
- это тот же экземпляр, что и ваш s1
, а s2
- это тот же экземпляр, что и ваш s2`.)
Но он также может вызвать compare
так:
comparator.compare(s2, s1)
не так ли?
Если он называет это вторым способом, то следует ожидать результата -33
.
РЕДАКТИРОВАТЬ:
Я посмотрел исходный код для TreeSet.add
и обнаружил, что он вызывает TreeMap.put
с элементом, который вы добавляете в качестве ключа.Если вы посмотрите дальше на TreeMap.put
, вы найдете:
Comparator<? super K> cpr = comparator;
if (cpr != null) {
do {
parent = t;
cmp = cpr.compare(key, t.key); // <--- "key" is the key passed into this method
// "t" is an element that is already in the map
if (cmp < 0)
t = t.left;
else if (cmp > 0)
t = t.right;
else
return t.setValue(value);
} while (t != null);
}
Это показывает, что TreeSet
действительно вызывает compare
, как я описал.
РЕДАКТИРОВАТЬ:
Как сказал Хольгер в комментариях, вы не должны реализовывать Comparator
, вычитая два целых числа.Вместо этого вы должны использовать Integer.compare
:
return Integer.compare(s1.num, s2.num);
На самом деле вообще не нужно реализовывать Comparator
, вы можете передать Comparator.comparingInt(s -> s.num)
при создании TreeMap
:
TreeSet<Sorted> t1 = new TreeSet<>(Comparator.comparingInt(s -> s.num));