31

这是我用于 Java 5.0 的一段代码

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

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

有没有更优化的方法呢?

4

5 回答 5

42

为什么你认为这种方法不会被优化?相反的顺序Comparator只是将输出的符号从实际Comparator(或插入compareToComparable对象上的输出)翻转过来,因此我认为它非常快。

descendingIterator()另一种建议:与其更改存储元素的顺序,不如使用该方法以降序遍历它们。

于 2009-07-07T08:14:01.233 回答
10

TreeSet::descendingSet

在 Java 6 及更高版本中,有一个TreeSet称为descendingSet()生成NavigableSet接口对象的方法。

公共 NavigableSet 降序集()

降序集由该集支持,因此对集的更改会反映在降序集中,反之亦然。如果在对任一集进行迭代时修改了任一集(通过迭代器自己的删除操作除外),则迭代的结果是未定义的。

    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
于 2010-05-18T21:54:13.793 回答
7
TreeSet<Integer> treeSetObj = new TreeSet<Integer>(new Comparator<Integer>()
  {
  public int compare(Integer i1,Integer i2)
        {
        return i2.compareTo(i1);
        }
  });

需要翻转结果。但我想这只是一个微优化......你真的需要这个吗?

于 2009-07-07T08:16:58.123 回答
2

使用 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); 
    } 
} 
于 2020-07-04T10:07:16.900 回答
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);
        }
}
  }
于 2018-10-28T04:53:32.683 回答