Treeset для упорядочивания элементов в порядке убывания
Вот фрагмент кода, который я использовал для Java 5.0
TreeSet<Integer> treeSetObj = new TreeSet<Integer>( Collections.reverseOrder() ) ;
Collections.reverseOrder() используется для получения компаратора, чтобы изменить способ хранения и повторения элементов.
Есть ли более оптимизированный способ сделать это?
Ответы
Ответ 1
Как вы думаете, почему этот подход не будет оптимизирован? Обратный порядок Comparator
просто перевернет знак вывода из фактического Comparator
(или выводит из compareTo
на вставленные объекты Comparable
), поэтому я бы предположил, что это очень быстро.
Альтернативное предложение: вместо изменения порядка, в котором вы храните элементы, вы можете перебирать их в порядке убывания с помощью метода descendingIterator()
.
Ответ 2
TreeSet::descendingSet
В Java 6 и выше, существует метод на TreeSet
называется descendingSet()
производя NavigableSet
объект интерфейса.
public NavigableSet убывающий набор()
Нисходящий набор поддерживается этим набором, поэтому изменения в наборе отражаются в нисходящем наборе, и наоборот. Если какой-либо набор изменяется во время выполнения итерации по любому набору (кроме как через собственную операцию удаления итератора), результаты итерации не определены.
The returned set has an ordering equivalent to
Collections.reverseOrder (компаратор()). Выражение s.descendingSet(). DownndingSet() возвращает представление s, по существу эквивалентное s.
Specified by:
descendingSet in interface NavigableSet<E>
Returns:
a reverse order view of this set
Since:
1.6
Ответ 3
TreeSet<Integer> treeSetObj = new TreeSet<Integer>(new Comparator<Integer>()
{
public int compare(Integer i1,Integer i2)
{
return i2.compareTo(i1);
}
});
необходимо перевернуть результат. Но я думаю, это просто микрооптимизация... Вам это действительно нужно?
Ответ 4
Обратное compare
Вы можете изменить порядок двух аргументов в методе compare
вашего Comparator
.
TreeSet t = new TreeSet(new MyComparator());
{
class MyComparator implements Comparator
{
public int compare(Integer i1,Integer i2)
{
Integer I1=(Integer)i1;
Integer I2=(Integer)i2;
return I2.compareTo(I1); // return -I1compareTo(I2);
}
}
}