28

リストからアイテムを削除する効率的な方法が必要です。何らかの条件が発生した場合、リストから最初の「n」要素を削除する必要があります。誰かがこれを行うための最良の方法を提案できますか?覚えておいてください:パフォーマンスは私にとっての要因なので、私はイタリングするよりも速い方法が必要です。ありがとう。

リストの先頭として「n」番目のアイテムを作成し、0〜n個のアイテムがガベージコレクションされるようにする方法を考えています。出来ますか?

4

8 に答える 8

22

作成subList()

fromIndex(包括的)とtoIndex(排他的)の間のこのリストの部分のビューを返します。(fromIndexとtoIndexが等しい場合、返されるリストは空です。)返されるリストはこのリストに基づいているため、返されたリストの変更はこのリストに反映され、その逆も同様です。返されるリストは、このリストでサポートされているすべてのオプションのリスト操作をサポートします。

このメソッドの実装を確認し、パフォーマンスを判断するためにいくつかのテストを行います

于 2012-09-17T09:17:16.107 に答える
11

Jigar Joshiの答えは、あなたが必要とする解決策をすでに含んでいます。他のものを追加したかった。サブリストを呼び出すclear()と、作業が処理されると思います。しかし、バックグラウンドでイテレーションを使用している可能性があります。よくわかりません。使用するスクリプトの例:

ArrayList<Integer> list = new ArrayList<Integer>();
ArrayList<Integer> subList = (ArrayList<Integer>) list.subList(0, 9);
subList.clear();
于 2012-09-17T09:23:07.953 に答える
9

を使用できますArrayList.removeRange(int fromIndex, int toIndex)

ドキュメントの引用:

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

于 2012-09-17T09:18:24.073 に答える
5

パフォーマンスが重要な場合は、ArrayListの組み込み関数を使用する方法がわかりません。O(n)よりも高速に実行されるとは思えませんが、残念ながらJavaのドキュメントにはそれについて何も書かれていません。たぶん、ロープのようなカスタムメイドの構造を調べる必要があります。

于 2012-09-17T09:24:53.393 に答える
4

単一行のソリューションは次のとおりです。

 list.subList(n, m).clear();

インデックスでm - n始まり、インデックスで終わる要素をリストから削除します。nm - 1

于 2020-05-29T21:49:31.733 に答える
3

リストを頻繁に変更する場合は、LinkedListクラスを使用してみませんか?

ArrayListクラスを使用する場合、アイテムを削除するときは、配列を常に移動する必要があります。

于 2012-09-17T09:26:34.953 に答える
3

kotlinエクステンション

/**
 * @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]

refrerence

https://www.cnblogs.com/gaojing/archive/2012/06/17/java-list-sublist-caution.html

于 2018-08-11T07:59:48.890 に答える
0

スキップリストの使用を検討してください。ドロップされたアイテムの数を間隔に合わせて作成すると、パフォーマンスが向上します。

反復を完全に省略することはできませんが、反復の数を減らしたり、「一定」にすることは可能です。

于 2012-09-17T09:21:37.483 に答える