【问题标题】: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 的顺序,以便以相反的顺序插入项目。

标签: java core collections treeset


【解决方案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);
                }
        }
          }
        

        【讨论】:

        猜你喜欢
        • 2014-07-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-10-29
        • 1970-01-01
        • 2014-01-22
        • 2020-08-16
        相关资源
        最近更新 更多