Treeset按降序排列元素

时间:2009-07-07 08:10:59

标签: java core collections treeset

以下是我用于Java 5.0的代码段

TreeSet<Integer> treeSetObj = new TreeSet<Integer>( Collections.reverseOrder() ) ;

Collections.reverseOrder()用于获取比较器,以反转元素的存储和迭代方式。

有更优化的方法吗?

5 个答案:

答案 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

您可以在compareComparator方法中反转两个参数的顺序。

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); 
    } 
}