以下是我用于Java 5.0的代码段
TreeSet<Integer> treeSetObj = new TreeSet<Integer>( Collections.reverseOrder() ) ;
Collections.reverseOrder()用于获取比较器,以反转元素的存储和迭代方式。
有更优化的方法吗?
答案 0 :(得分:41)
为什么你认为这种方法不会被优化?反向顺序Comparator
只是翻转实际Comparator
的输出符号(或compareTo
对象的Comparable
输出)我会因此想象它非常快。
另一种建议:不是更改存储元素的顺序,而是使用descendingIterator()
方法按降序迭代它们。
答案 1 :(得分:10)
TreeSet::descendingSet
在Java 6及更高版本中,TreeSet
上有一个名为descendingSet()
的方法,用于生成NavigableSet
接口对象。
public NavigableSet descendingSet()
降序集由此支持 设置,所以对集合的更改 反映在降序集中,和 反之亦然。如果修改了任一组 而任何一组的迭代都是 正在进行中(除了通过 迭代器自己的删除操作),. 迭代的结果是 未定义。
The returned set has an ordering equivalent to
Collections.reverseOrder(比较())。 表达方式 s.descendingSet()。descendingSet() 基本上返回s的视图 相当于s。
Specified by: descendingSet in interface NavigableSet<E> Returns: a reverse order view of this set Since: 1.6
答案 2 :(得分:6)
TreeSet<Integer> treeSetObj = new TreeSet<Integer>(new Comparator<Integer>()
{
public int compare(Integer i1,Integer i2)
{
return i2.compareTo(i1);
}
});
需要翻转结果。但我想这是只是micro-optimization ......你真的需要这个吗?
答案 3 :(得分:1)
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);
}
}
}
答案 4 :(得分:1)
使用DescendingSet方法,您可以反转类中现有的treeSet
import java.util.TreeSet;
public class TreeSetDescending {
public static void main(String[] args)
{
// Declare a treeset
TreeSet<Object> ints = new TreeSet<Object>();
ints.add(2);
ints.add(20);
ints.add(10);
ints.add(5);
ints.add(7);
ints.add(3);
// Initialize treeset with predefined set in reverse order
// using descendingSet()
TreeSet<Object> intsReverse = (TreeSet<Object>)ints.descendingSet();
// Print the set
System.out.println("Without descendingSet(): " + ints);
System.out.println("With descendingSet(): " + intsReverse);
}
}