簡體   English   中英

從列表中刪除前“n”個元素而不進行迭代

[英]Remove first 'n' elements from list without iterating

我需要一種從列表中刪除項目的有效方法。 如果發生某種情況,我需要從列表中刪除前 'n' 個元素。 有人可以建議最好的方法嗎? 請記住:性能對我來說是一個因素,所以我需要一種比迭代更快的方法。 謝謝。

我正在考慮一種方法,通過該方法可以將第 n 個項目作為列表的開頭,以便 0-n 個項目將被垃圾收集。 是否有可能?

創建子subList()

返回此列表中 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 文檔對此一無所知。 也許你應該研究一些定制的結構,比如Rope

如果經常修改列表,為什么不使用 LinkedList 類呢?

如果使用 ArrayList 類,則在刪除項目時,數組必須始終移動。

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]

參考

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

單行解決方案是:

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

從從索引n開始到索引m - 1停止的列表中刪除m - n元素。

考慮使用跳過列表,如果您將丟棄的項目數量等分到間隔,這將為您提供良好的性能

根本不可能省略迭代,但可以減少迭代次數甚至使其“恆定”

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM