我需要一种从列表中删除项目的有效方法。如果发生某种情况,我需要从列表中删除前 '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 文档对此只字未提。也许您应该研究一些定制结构,例如Rope。
单行解决方案是:
list.subList(n, m).clear();
从列表中删除m - n
从 index 开始的元素,在 index 处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
考虑使用Skip Lists,如果您将丢弃的项目数量等分到间隔,这将为您提供良好的性能
根本不可能省略迭代,但可以减少迭代次数甚至使其“恒定”