树集以降序排列元素

Posted

技术标签:

【中文标题】树集以降序排列元素【英文标题】:Treeset to order elements in descending order 【发布时间】:2010-11-08 14:59:10 【问题描述】:

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

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

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

有没有更优化的方法?

【问题讨论】:

在被覆盖的compareTo 中翻转thisthat 的顺序,以便以相反的顺序插入项目。 【参考方案1】:

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

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

【讨论】:

谢谢。 descendingIterator() 方法是在 6.0 中引入的,在 5.0 中没有【参考方案2】:

TreeSet::descendingSet

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

public NavigableSet descendingSet()

降序集由 this 支持 集,所以对集的更改是 反映在下降的集合中,并且 反之亦然。如果任一集合被修改 而对任一集合的迭代是 进行中(除了通过 迭代器自己的删除操作), 迭代的结果是 未定义。

    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

【讨论】:

【参考方案3】:
TreeSet<Integer> treeSetObj = new TreeSet<Integer>(new Comparator<Integer>()
  
  public int compare(Integer i1,Integer i2)
        
        return i2.compareTo(i1);
        
  );

需要翻转结果。但我想这只是micro-optimization...你真的需要这个吗?

【讨论】:

【参考方案4】:

使用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); 
     
 

【讨论】:

【参考方案5】:

反向compare

您可以颠倒您的Comparatorcompare 方法中两个参数的顺序。

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

  

【讨论】:

似乎是旧版Answer by Pierre的复制品。

以上是关于树集以降序排列元素的主要内容,如果未能解决你的问题,请参考以下文章

查询显示 2010 年每个月的总利润降序排列?

按字段降序排列

Codeigniter 分页链接按降序/倒序排列?

java编程将一组数组元素按照由大到小降序排列.

初识java集合——树集

排序数组在Javascript:与按降序排列的大多数元素项目[复制]