2016-04-11 8 views
-1

Iterableを実装したカスタムリスト(コレクションではありません)があります。リストが実装されていないのは、そうしすぎるとメソッドが必要なくなり、必要がないからです。Iterableをソートする方法

私CustomListに関するいくつかのより多くの情報に:

  • すべてのメンバーが
  • 最終的なもので、すべてのCustomListは別のCustomList
  • である "サブリスト" を持つことができ、すべてのCustomListは正確に一つのMyThing
  • を持たなければなりません例:AがMyThingのオブジェクトで、BがMyThingのオブジェクトであるとすると、Aのみを持つCustomList(AListと呼ぶ)と、ItemListとAListをSublistとして持つCustomListがあります。
  • CustomListだから、これは私のクラスであるMyThings

の配列を取ることができますコンストラクタを持っています

public class CustomList implements Iterable<MyThing> { 

    private final CustomList sublist; 

    private final MyThing thing; 

    // getters and other methods 
} 

そして、私は

Comparator<MyThing> 

MyThingあります

public class MyThing { 

    private final IntArrayList values; 
    // more members and methods 
} 

私はCustomListsのCustomListとしてソートされたコピーを取得したいと思います(私のコンパイラが問題にならないようにしていれば、これまでの解決方法ですが)。

私がこれまで行ったこと次のとおりです。

  1. は、これが正常に動作しますが、そこにあれば、私は思っていたCustomList

に戻ってそれを転送リストに(コンパレータ付き)

  • ソートそのリストを
  • を私CustomListを変革anotheです私の目標に達するために(おそらくよりエレガントな方法で)。

  • +0

    「MyThing」とは何ですか?フィールドとプロパティは何ですか?あなたの選別基準は何ですか? –

    +1

    コレクションを拡張する代わりにIterableを実装する理由を説明できますか? –

    +3

    Guavaの 'Ordering'(' Comparator'を拡張しています)を使うと、['ordering.sortedCopy(iterable)'](http:// docs。guava-libraries.googlecode.com/git/javadoc/com/google/common/collect/Ordering.html#sortedCopy(java.lang.Iterable))。しかし、これは基本的にあなたがすでにやっていることです。 –

    答えて

    3

    コアJavaライブラリでは、Iterableで動作するソートアルゴリズムが公開されていません。

    組み込みソートでは、要素を一時配列にコピーします。 (ArrayListは、内部配列をソート関数に渡すことでこれを最適化します)。現在のアプローチでは、ListではなくObject[]の間で要素をコピーすることをお勧めします。次にCollections.sort()の代わりにArrays.sort()を使用してください。これにより、実際に使用されていないListオブジェクトの作成が節約されます。

    カスタムコレクションのインプレイスソートを実行する場合は、ソートアルゴリズムを自分で実装することができます。これは大変難しいことではありませんが、コードが増えるとバグやメンテナンスが増え、JREにバンドルされている改良(「MergeSort」から「TimSort」への移行など)のメリットはありません。その利益がそれに値するかどうかはあなただけが言うことができます。

    関連する問題