web-dev-qa-db-ja.com

要素を降順に並べるツリーセット

Java 5.0に使用したコードの一部を次に示します。

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

Collections.reverseOrder()は、要素の保存と反復の方法を逆にするためにコンパレータを取得するために使用されます。

それを行うためのより最適化された方法はありますか?

30
Gaurav Saini

なぜこのアプローチは最適化されないと思いますか? Comparatorの逆の順序は、実際のComparatorからの出力の符号を反転するだけです(または、挿入されるcompareToオブジェクトのComparableからの出力)したがって、私はそれが非常に速いと想像します。

別の提案:要素を格納する順序を変更するのではなく、descendingIterator()メソッドを使用して要素を降順に繰り返すことができます。

41
Adamski

_TreeSet::descendingSet_

Java 6以降では、 TreeSetdescendingSet() と呼ばれるメソッドがあります。 NavigableSet インターフェイスオブジェクト。

public NavigableSet descendingSet()

降順セットはこのセットに連動しているため、セットへの変更は降順セットに反映され、逆も同様です。いずれかのセットの反復が進行中にいずれかのセットが変更された場合(反復子自体の削除操作を除く)、反復の結果は未定義です。

_    The returned set has an ordering equivalent to
_

Collections.reverseOrder(comparator())。式s.descendingSet()。descendingSet()は、本質的にsと同等のsのビューを返します。

_    Specified by:
        descendingSet in interface NavigableSet<E>

    Returns:
        a reverse order view of this set
    Since:
        1.6
_
10
Brian
TreeSet<Integer> treeSetObj = new TreeSet<Integer>(new Comparator<Integer>()
  {
  public int compare(Integer i1,Integer i2)
        {
        return i2.compareTo(i1);
        }
  });

結果を反転する必要があります。しかし、私はこれが単なる マイクロ最適化だと思う...あなたは本当にこれが必要ですか?

6
Pierre

compareを反転

compareComparator メソッドで2つの引数の順序を逆にすることができます。

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