72

本当に自分で実装する必要がありますか?

private void shrinkListTo(ArrayList<Result> list, int newSize) {
  for (int i = list.size() - 1; i >= newSize; --i)
  list.remove(i);
}
4

6 に答える 6

138

削除する要素の範囲でサブリストを作成clearし、返されたリストを呼び出します。

list.subList(23, 45).clear()

このアプローチは、 ListArrayListの両方のドキュメントでイディオムとして言及されています。


これは完全に単体テストされたコード例です!

// limit yourHappyList to ten items
int k = yourHappyList.size();
if ( k > 10 )
    yourHappyList.subList(10, k).clear();
    // sic k, not k-1
于 2009-07-26T13:57:47.920 に答える
8

または、 subListメソッドを使用できます。

public static <T> List<T> shrinkTo(List<T> list, int newSize) {
    return list.subList(0, newSize - 1);
}
于 2009-07-26T13:59:20.947 に答える
6

ArrayList#removeRange()メソッドを使用します。

protected void removeRange(int fromIndex, int toIndex)

このリストから、インデックスが fromIndex (これを含む) と toIndex (これを含まない) の間にあるすべての要素を削除します。後続の要素を左にシフトします (インデックスを減らします)。この呼び出しは、リストを (toIndex - fromIndex) 要素分短縮します。(toIndex==fromIndex の場合、この操作は効果がありません。)

次にArrayList#trimToSize()メソッドを使用します。

リストの現在のサイズになるように、この ArrayList インスタンスの容量をトリミングします。アプリケーションは、この操作を使用して、ArrayList インスタンスのストレージを最小限に抑えることができます。

于 2009-07-26T13:51:43.140 に答える
1

別の考慮事項があります。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 によるこのお気に入りの記事を参照してください。

于 2009-07-26T13:52:07.367 に答える