Я знаю, что в наборе деревьев Java не может быть идентичных элементов, и поэтому мне нужно как-то отличать один элемент от другого, даже если они имеют одинаковое «значение».Я хочу иметь возможность ранжировать элементы, и я замечаю интересное поведение.
TreeSet<Integer> set = new TreeSet<Integer>(new Comparator<Integer>()
{
public int compare(Integer arg0, Integer arg1)
{
if(arg0 > arg1)
return -1;
return 1;
}
});
set.add(40);
set.add(20);
set.add(30);
set.add(20);
for(Integer i:set)
{
System.out.println("Rank: "+(set.headSet(i,false).size()+1)+" Number: "+i);
}
И это вывод:
Rank: 1 Number: 40
Rank: 3 Number: 30
Rank: 5 Number: 20
Rank: 5 Number: 20
Это то, что должна делать гарнитура:
Returns a view of the portion of this set whose elements are less than (or equal to, if inclusive is true) toElement. The returned set is backed by this set, so changes in the returned set are reflected in this set, and vice-versa. The returned set supports all optional set operations that this set supports.
Я сортирую в порядке убывания, поэтому я думаю, что должно быть наоборот.Первый элемент не имеет ничего больше, чем он, поэтому он возвращает 0, а затем я добавляю 1, чтобы получить его ранг.Второй элемент имеет одну вещь больше, чем он, поэтому я думаю, что он должен возвращать 1, добавив 1, делает 2. Это немного странно.Я думаю, что делаю простую ошибку.Мне также нужно выяснить, как бороться с двумя 20-х годов.Я хочу, чтобы их ранг был 3, но древовидная структура считает, что они разные числа.Я полагаю, я мог бы использовать TreeMultiSet или какую-либо другую стороннюю библиотеку.