-2

私はしばらくの間私を悩ませてきた問題を抱えています。私は、物理的な世界で特定の数のオブジェクトを生成し、それらをArrayListに格納するソフトウェアを持っています。ただし、この実装では、ArrayList からオブジェクトを削除するときに遅延が発生します。

静的配列の実装はラグにはつながりませんが、「追加」と「削除」を使用できないため、あまり実用的ではありません。

ArrayLists の遅延は、メモリの解放と再割り当てが原因であると想定しています。私の ArrayList には最大サイズが固定されているため、これらの問題を回避するために特定のメモリを事前に割り当てることは可能ですか? または、これに対する別の解決策はありますか?

助けてくれてありがとう!

4

2 に答える 2

2

私は通常、他の誰かの回答を再投稿するだけではありませんが、これは非常にうまくいくようです。

于 2012-06-22T07:56:41.520 に答える
2

ここでの問題はArrayList、名前が示すように、配列を使用して an が内部的に実装されていることです。これは、作業中のインデックスの後に要素を移動しない限り、コレクションの要素を自由に挿入または削除できないことを意味します。

したがって、コレクションに多くの要素があり、たとえば 5 番目を削除する場合、リストの 6 番目から最後までのすべての要素を 1 つ左にシフトする必要があります。これは確かにコストがかかる可能性があり、O(n)の複雑さにつながります。

これらの問題を回避するには、使用する最も一般的な操作に従って適切なコレクションを選択する必要があります。ALinkedListは、繰り返し、削除する必要がある場合 (実際には削除するには要素を見つける必要があるため、既にそれらを列挙している場合にのみ有効です)、または要素を挿入する必要がある場合に適していますが、特定のインデックスにアクセスする必要がある場合はいつでも問題が発生します。

HashSetまたはを探すこともTreeSetできます。それらはソリューションに適している可能性があります。

このような状況では、最も一般的なデータ構造がどのように機能し、どれが良い/悪いかを知ることは、適切な選択を行うのに常に役立ちます。

于 2012-06-22T08:02:11.787 に答える