web-dev-qa-db-ja.com

リストから範囲(テール)を削除する

X要素の範囲(末尾など)をListから削除する効率的な方法はありますか。 LinkedList Javaで?

最後の要素を1つずつ削除することは明らかに可能です。これにより、O(X)レベルのパフォーマンスが得られます。少なくともLinkedListインスタンスの場合、= O(1)パフォーマンス(削除する最初の要素の周りの参照を設定し、ヘッド/テールの参照を設定することにより)。残念ながら、List内にはメソッドがありませんLinkedListは、最後の要素を一度にすべて削除します。

現在、私は List.subList() を使用してリストを置換することを考えていますが、それがわからない同等のパフォーマンスがあります。少なくともコード内ではより明確になりますが、一方でLinkedListが提供する追加機能を失うことになります。

私は主にListをスタックとして使用していますが、少なくともセマンティクスに関してはLinkedListが最良のオプションのようです。

36
Maarten Bodewes

subList(list.size() - N, list.size()).clear()は、最後のN要素を削除するための推奨方法です。実際、 subListのJavadocは特にこのイディオムを推奨しています。

この方法では、明示的な範囲操作(配列に一般的に存在する種類の操作)が不要になります。リストを期待するすべての操作は、リスト全体ではなくsubListビューを渡すことにより、範囲操作として使用できます。たとえば、次のイディオムはリストから要素の範囲を削除します。

_ list.subList(from, to).clear();
_

確かに、このイディオムはremoveLast()Nを呼び出すよりも(定数係数ではありますが)より効率的かもしれないと思います。これは、Nth-最後のノードまで、最後のNノードのそれぞれのポインターを一度に1つずつ更新するのではなく、リンクリスト内の定数のポインターを更新するだけで済みます。

67
Louis Wasserman