本当に自分で実装する必要がありますか?
private void shrinkListTo(ArrayList<Result> list, int newSize) {
for (int i = list.size() - 1; i >= newSize; --i)
list.remove(i);
}
削除する要素の範囲でサブリストを作成clear
し、返されたリストを呼び出します。
list.subList(23, 45).clear()
このアプローチは、 ListとArrayListの両方のドキュメントでイディオムとして言及されています。
これは完全に単体テストされたコード例です!
// limit yourHappyList to ten items
int k = yourHappyList.size();
if ( k > 10 )
yourHappyList.subList(10, k).clear();
// sic k, not k-1
または、 subListメソッドを使用できます。
public static <T> List<T> shrinkTo(List<T> list, int newSize) {
return list.subList(0, newSize - 1);
}
ArrayList#removeRange()メソッドを使用します。
protected void removeRange(int fromIndex, int toIndex)
このリストから、インデックスが fromIndex (これを含む) と toIndex (これを含まない) の間にあるすべての要素を削除します。後続の要素を左にシフトします (インデックスを減らします)。この呼び出しは、リストを (toIndex - fromIndex) 要素分短縮します。(toIndex==fromIndex の場合、この操作は効果がありません。)
次にArrayList#trimToSize()メソッドを使用します。
リストの現在のサイズになるように、この ArrayList インスタンスの容量をトリミングします。アプリケーションは、この操作を使用して、ArrayList インスタンスのストレージを最小限に抑えることができます。
別の考慮事項があります。ArrayList
メソッド シグネチャでan を使用することを避け、代わりにインターフェイスに取り組みたいと思うかもしれません。これは、たとえば a の方がニーズにより適していることがわかった場合List
に、実装に結び付けられ、ArrayList
変更が困難になるためです。LinkedList
. この密結合を防止するには代償が伴います。
別のアプローチは次のようになります。
private void shrinkListTo(List<Result> list, int newSize) {
list.retainAll(list.subList(0, newSize);
}
残念ながら、このList.retainAll()
メソッドはサブクラスの実装ではオプションであるため、 を実行してから別のことを行う必要がありcatch
ますUnsupportedOperationException,
。
private void shrinkListTo(List<Result> list, int newSize) {
try {
list.retainAll(list.subList(0, newSize);
} catch (UnspportedOperationException e) {
//perhaps log that your using your catch block's version.
for (int i = list.size() - 1; i >= newSize; --i)
list.remove(i);
}
}
}
それはあなたのオリジナルほど簡単ではありません。渡す List のインスタンスに関連付けられていない場合は、 を呼び出すことで新しいインスタンスを簡単に返すことができsubList(int start, int end)
、メソッドを作成する必要さえありません。これは、(Java 6 では)AbstractList.SubList
リスト、リストへのオフセット、およびサイズを含む のインスタンスを取得するため、より高速な実装にもなります。繰り返す必要はありません。
クラスではなくインターフェイスへのコーディングの引数に興味がある場合は、Allen Holub によるこのお気に入りの記事を参照してください。