リストからアイテムを削除する効率的な方法が必要です。何らかの条件が発生した場合、リストから最初の「n」要素を削除する必要があります。誰かがこれを行うための最良の方法を提案できますか?覚えておいてください:パフォーマンスは私にとっての要因なので、私はイタリングするよりも速い方法が必要です。ありがとう。
リストの先頭として「n」番目のアイテムを作成し、0〜n個のアイテムがガベージコレクションされるようにする方法を考えています。出来ますか?
fromIndex(包括的)とtoIndex(排他的)の間のこのリストの部分のビューを返します。(fromIndexとtoIndexが等しい場合、返されるリストは空です。)返されるリストはこのリストに基づいているため、返されたリストの変更はこのリストに反映され、その逆も同様です。返されるリストは、このリストでサポートされているすべてのオプションのリスト操作をサポートします。
このメソッドの実装を確認し、パフォーマンスを判断するためにいくつかのテストを行います
Jigar Joshiの答えは、あなたが必要とする解決策をすでに含んでいます。他のものを追加したかった。サブリストを呼び出すclear()
と、作業が処理されると思います。しかし、バックグラウンドでイテレーションを使用している可能性があります。よくわかりません。使用するスクリプトの例:
ArrayList<Integer> list = new ArrayList<Integer>();
ArrayList<Integer> subList = (ArrayList<Integer>) list.subList(0, 9);
subList.clear();
を使用できますArrayList.removeRange(int fromIndex, int toIndex)
。
ドキュメントの引用:
このリストから、インデックスがfromIndex(包括的)とtoIndex(排他的)の間にあるすべての要素を削除します。後続の要素を左にシフトします(インデックスを減らします)。この呼び出しは、リストを(toIndex --fromIndex)要素で短縮します。(toIndex == fromIndexの場合、この操作は効果がありません。)
パフォーマンスが重要な場合は、ArrayListの組み込み関数を使用する方法がわかりません。O(n)よりも高速に実行されるとは思えませんが、残念ながらJavaのドキュメントにはそれについて何も書かれていません。たぶん、ロープのようなカスタムメイドの構造を調べる必要があります。
単一行のソリューションは次のとおりです。
list.subList(n, m).clear();
インデックスでm - n
始まり、インデックスで終わる要素をリストから削除します。n
m - 1
リストを頻繁に変更する場合は、LinkedListクラスを使用してみませんか?
ArrayListクラスを使用する場合、アイテムを削除するときは、配列を常に移動する必要があります。
/**
* @param length remove index [0..length)
*/
fun <E> MutableList<E>.removeFirst(length: Int): MutableList<E> {
if (length in 1..size) {
subList(0, length).clear()
}
return this
}
/**
* @param length remove index [(size - length)..size)
*/
fun <E> MutableList<E>.removeLast(length: Int): MutableList<E> {
if (length in 1..size) {
subList(size - length, size).clear()
}
return this
}
package hello // 可选的包头
/**
* @param length remove index [0..length)
*/
fun <E> MutableList<E>.removeFirst(length: Int): MutableList<E> {
if (length in 1..size) {
subList(0, length).clear()
}
return this
}
/**
* @param length remove index [(size - length)..size)
*/
fun <E> MutableList<E>.removeLast(length: Int): MutableList<E> {
if (length in 1..size) {
subList(size - length, size).clear()
}
return this
}
fun main(args: Array<String>) { // 包级可见的函数,接受一个字符串数组作为参数
println("Hello World!") // 分号可以省略
val list = mutableListOf<String>("0","1","2","3","4","5","6","7")
println(list)
list.removeFirst(2)
println(list)
list.removeLast(2)
println(list)
}
Hello World!
[0, 1, 2, 3, 4, 5, 6, 7]
[2, 3, 4, 5, 6, 7]
[2, 3, 4, 5]
https://www.cnblogs.com/gaojing/archive/2012/06/17/java-list-sublist-caution.html
スキップリストの使用を検討してください。ドロップされたアイテムの数を間隔に合わせて作成すると、パフォーマンスが向上します。
反復を完全に省略することはできませんが、反復の数を減らしたり、「一定」にすることは可能です。