我需要一种从列表中删除项目的有效方法。如果发生某些情况,我需要从列表中删除第一个'n'个元素。有人可以建议最好的方法吗?请记住:性能是我的一个因素,所以我需要一种比itterating更快的方法。感谢。
我正在考虑一种方法,通过这种方式可以将第n个项目作为列表的开头,以便0-n项目将被垃圾收集。有可能吗?
答案 0 :(得分:21)
返回此列表中fromIndex(包含)和toIndex(不包括)之间的部分视图。 (如果fromIndex和toIndex相等,则返回的列表为空。)返回的列表由此列表支持,因此返回列表中的更改将反映在此列表中,反之亦然。返回的列表支持此列表支持的所有可选列表操作。
检查此方法的实现并进行一些测试以确定性能
答案 1 :(得分:9)
您可以使用ArrayList.removeRange(int fromIndex, int toIndex)
。
从此列表中删除索引介于其中的所有元素 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)
/**
* @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