解説
SortedList
JDK に実装がないのには、おそらく十分な理由があります。個人的には、JDK で自動ソートを 1 つ持つ理由が思い浮かびません。
時期尚早の最適化がうまくいかなかったのです。リストが挿入されるほど頻繁に読み取られない場合、理由もなく繰り返しソートするサイクルを無駄にしています。読み取りの直前にソートすると、はるかに反応的になりboolean
、リストを読み取る前にソートする必要があるかどうかを示す場所があれば、さらに優れています。
Iterator
問題は、 orfor each
ループでリストをトラバースするときの順序だけを本当に気にすることです。そのためCollections.sort()
、反復するコードの前に呼び出す方が、挿入のたびにリストを常にソートしたままにしようとするよりもおそらくパフォーマンスが向上します。
重複のためにあいまいさがありますがList
、重複をどのように決定論的に順序付けますか? がありSortedSet
、それは独自性のために理にかなっています。ただし、 a の並べ替えはList
、重複の副作用や、すべてのオブジェクトを作成するなどのその他の制約から、より複雑になる可能性があります。Comparable
または、コードで示すように、Comparator
代わりに作業を実行できる a が必要です。
並べ替え中.add()
自動ソートが役立つ非常に特別な状況がある場合、実装をList
サブクラス化し、オーバーライドしてカスタムコンストラクターに渡すことを行うことができます。代わりに使用した理由は、そもそも自然な挿入ソート順です。また、常にソートしたい場合はかなり役に立たないインデックスを作成する機能もあります。これは、おそらく理想的ではない何らかの方法で処理する必要があります。Javadocによると;List
.add()
Collections.sort(this, comparator)
LinkedList
ArrayList
ArrayList
List
.add()
List
void add(int index, Object element)
指定された要素をこのリストの指定された位置に挿入します (オプションの操作)。
したがって、スローするだけでもかまいません。または、メソッドの JavaDoc で文書化する場合は、をUnSupportedOperationException
無視しindex
てデリゲートすることもできます。.add(Object element);
通常、多くの挿入/削除とソートが必要な場合LinkedList
は、`List' を使用するとパフォーマンス特性が向上するため、 を使用します。
簡単な例を次に示します。
import java.util.Collections;
import java.util.Comparator;
import java.util.LinkedList;
public class SortedList<E> extends LinkedList<E>
{
private Comparator<E> comparator;
public SortedList(final Comparator<E> comparator)
{
this.comparator = comparator;
}
/**
* this ignores the index and delegates to .add()
* so it will be sorted into the correct place immediately.
*/
@Override
public void add(int index, Object element)
{
this.add(element);
}
@Override
public boolean add(final E e)
{
final boolean result = super.add(e);
Collections.sort(this, this.comparator);
return result;
}
}
最も効率的なソリューション:
または、 を取得するときにのみソートすることもできますIterator
。ソートされた順序が を反復処理するときにのみ重要である場合、これはよりパフォーマンス指向になりList
ます。これは、すべての反復の前に呼び出す必要のないクライアント コードのユース ケースをカバーし、Collections.sort()
その動作をクラスにカプセル化します。
import java.util.Collections;
import java.util.Comparator;
import java.util.Iterator;
import java.util.LinkedList;
public class SortedList<E> extends LinkedList<E>
{
private Comparator<E> comparator;
public SortedList(final Comparator<E> comparator)
{
this.comparator = comparator;
}
@Override
public Iterator<E> iterator()
{
Collections.sort(this, this.comparator);
return super.iterator();
}
}
もちろん、エラーがComparator
あったnull
かどうか、エラーが発生した場合にどうするかを確認するために、エラーのチェックと処理が必要になりますが、これでアイデアが得られます。重複を処理する決定論的な方法はまだありません。
グアバソリューション:
Guava を使用している場合は、使用する必要があります。
Ordering.immutableSortedCopy()
反復して完了する必要がある場合のみ。