简体   繁体   English

以降序排列元素的树集

[英]Treeset to order elements in descending order

Here is the piece of code that I have used for Java 5.0这是我用于 Java 5.0 的一段代码

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

Collections.reverseOrder() is used to obtain a comparator in order to reverse the way the elements are stored and iterated. Collections.reverseOrder()用于获取比较器,以反转元素的存储和迭代方式。

Is there a more optimized way of doing it?有没有更优化的方法?

Why do you think this approach won't be optimized?为什么你认为这种方法不会被优化? The reverse order Comparator is simply going to be flipping the sign of the output from the actual Comparator (or output from compareTo on the Comparable objects being inserted) and I would therefore imagine it is very fast.逆序Comparator只是翻转实际Comparator的输出符号(或在插入的Comparable对象上从compareTo输出),因此我认为它非常快。

An alternative suggestion: Rather than change the order you store the elements in you could iterate over them in descending order using the descendingIterator() method.另一种建议:与其更改存储元素的顺序,不如使用descendingIterator()方法按降序迭代它们。

TreeSet::descendingSet

In Java 6 and later, there is a method on TreeSet called descendingSet() producing a NavigableSet interface object.在 Java 6 和更高版本中, TreeSet上有一个名为descendingSet()的方法,用于生成NavigableSet接口对象。

public NavigableSet descendingSet()公共 NavigableSet 降序集()

The descending set is backed by this set, so changes to the set are reflected in the descending set, and vice-versa.降序集合由该集合支持,因此对集合的更改反映在降序集合中,反之亦然。 If either set is modified while an iteration over either set is in progress (except through the iterator's own remove operation), the results of the iteration are undefined.如果在对任一集合进行迭代时修改任一集合(通过迭代器自己的删除操作除外),则迭代结果未定义。

 The returned set has an ordering equivalent to

Collections.reverseOrder(comparator()). Collections.reverseOrder(comparator())。 The expression s.descendingSet().descendingSet() returns a view of s essentially equivalent to s.表达式 s.descendingSet().descendingSet() 返回 s 的视图,本质上等同于 s。

 Specified by: descendingSet in interface NavigableSet<E> Returns: a reverse order view of this set Since: 1.6
TreeSet<Integer> treeSetObj = new TreeSet<Integer>(new Comparator<Integer>()
  {
  public int compare(Integer i1,Integer i2)
        {
        return i2.compareTo(i1);
        }
  });

there is need to flip the result.需要翻转结果。 But I guess this is just a micro-optimization ... Do you really need this ?但我想这只是一个微优化......你真的需要这个吗?

Using descendingSet method you can reverse existing treeSet in the class使用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); 
    } 
} 

Reverse compare反向compare

You can reverse the order of the two arguments in the compare method of your Comparator .您可以在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);
        }
}
  }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM