从列表中删除第一个'n'元素而不进行迭代

时间:2012-09-17 09:15:39

标签: java list

我需要一种从列表中删除项目的有效方法。如果发生某些情况,我需要从列表中删除第一个'n'个元素。有人可以建议最好的方法吗?请记住:性能是我的一个因素,所以我需要一种比itterating更快的方法。感谢。

我正在考虑一种方法,通过这种方式可以将第n个项目作为列表的开头,以便0-n项目将被垃圾收集。有可能吗?

8 个答案:

答案 0 :(得分:21)

创建subList()

  

返回此列表中fromIndex(包含)和toIndex(不包括)之间的部分视图。 (如果fromIndex和toIndex相等,则返回的列表为空。)返回的列表由此列表支持,因此返回列表中的更改将反映在此列表中,反之亦然。返回的列表支持此列表支持的所有可选列表操作。

检查此方法的实现并进行一些测试以确定性能

答案 1 :(得分:9)

您可以使用ArrayList.removeRange(int fromIndex, int toIndex)

引用documentation

  

从此列表中删除索引介于其中的所有元素   fromIndex,inclusive,toIndex,exclusive。任何成功的转变   左边的元素(减少它们的索引)。这个电话缩短了   列表(toIndex - fromIndex)元素。 (如果toIndex == fromIndex,这个   操作没有效果。)

答案 2 :(得分:8)

Jigar Joshi的答案已包含您需要的解决方案。我想补充一些其他的东西。我想,在子列表上调用clear()将处理您的工作。但它可能正在使用 在后台迭代,我不确定。您可以使用的示例脚本:

ArrayList<Integer> list = new ArrayList<Integer>();
ArrayList<Integer> subList = (ArrayList<Integer>) list.subList(0, 9);
subList.clear();

答案 3 :(得分:5)

如果性能对您来说很关键,那么我不确定是否可以使用ArrayList中的内置函数。我怀疑它们的运行速度比O(n)快,遗憾的是Java文档对此没有任何说明。也许你应该研究一些定制的结构,比如Rope

答案 4 :(得分:2)

如果经常修改列表,为什么不使用LinkedList类?

如果使用ArrayList类,则在删除项目时,数组必须始终移动。

答案 5 :(得分:2)

单行解决方案是:

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

从列表中以索引m - n开始,从索引n停止删除m - 1个元素。

答案 6 :(得分:0)

考虑使用Skip Lists,如果您将删除的项目数等分为间隔

,这将为您提供良好的性能

根本不可能省略迭代,但可以减少迭代次数甚至使其“不变”

答案 7 :(得分:0)

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