如何在Kotlin中从ArrayList中删除项目。

40
var arrayone: ArrayList<String> = arrayListOf("a","b","c")

val arraytwo:ArrayList<String> = arrayListOf(arrayone.removeAt(0))

for (item in arraytwo) {
  println(item)
}

我只想从第一个数组中删除项目并创建一个新数组,但这只会打印索引0处的一个项目。


1
请使用arrayone.subList(1)代替arrayListOf(arrayone.removeAt(0)) - Tim
3
removeAt 返回被移除的元素。你正在创建一个只包含被移除元素的新列表。 - Salem
你真的想从第一个列表中删除这些元素吗? - Roland
1
Swift 是否也从第一个列表中删除该特定项? - Roland
1
第一个列表包含什么内容? - Roland
显示剩余7条评论
7个回答

46

removeAt(0)从第一个列表中删除第一个元素并将其返回。arrayListOf然后使用已删除的项创建一个新的(第二个)列表。

arrayone现在包含:bcarraytwo现在包含a

如果您不想触及第一个列表,而且只想将剩余的项添加到新列表中,则可以使用drop,例如:

var arrayone: ArrayList<String> = arrayListOf("a","b","c")

val arraytwo = arrayone.drop(1)

for (item in arraytwo) {
  println(item) // now prints all except the first one...
}
// arrayone contains: a, b, c
// arraytwo contains: b, c

或者使用dropLast(1),如果您只想删除最后一项。或者使用dropWhile/dropLastWhile,如果您有一个条件要应用并且删除所有直到/到该条件为止...
如果您真的想从第一个列表中删除项目,并仅将已删除的项目添加到第二个列表中,则当前的方法是可以的。但是,如果您想要在特定索引处删除项目,并且只包含未删除项目的新列表,则需要首先构建第一个列表的副本,然后在该列表上应用您的removeAt,例如:
val arraytwo = arrayone.toMutableList().apply { 
  removeAt(0)
}
// or without the apply:
arraytwo.removeAt(0)

或者您可以使用filterIndexed来解决这个问题:

val arraytwo = arrayone.filterIndexed { index, _ ->
  index != 1 // you can also specify more interesting filters here...
} // filter, map, etc. all return you a new list. If that list must be mutable again, just add a .toMutableList() at the end

通过使用filterIndexedfilterdrop等方法,您可以确保第一个列表保持不变。如果您一开始就不想触碰第一个列表,您可能更想使用listOftoList,即只需一个List类型,它不会暴露可变函数(还请参阅Kotlin reference regarding Collections: List, Set, Map)。
也许您还对filter/filterNot感兴趣,然后很快就会涉及到minus或类似的函数来删除无索引的不需要的项目。

但是 drop 返回除了前 n 个元素以外的所有元素。所以,如果我想删除第三个元素,它就没有用处。 - Selçuk Yıldız
ArrayList不是可变的吗? - Selçuk Yıldız
1
好的,明白了。我需要复制一份来创建一个新的,并从复制品中删除项目。但我认为这有点奇怪,对于这么简单的情况要进行两个步骤。谢谢。 - Selçuk Yıldız
正如我所说,我是 Kotlin 的新手。因此,我会将所有事情与 Swift 进行比较。有时候很难理解这种情况。 - Selçuk Yıldız
越想越觉得...如果你不想改变第一个列表,那么请使用它的不可变版本...我添加了一种使用filterIndexed的方法,这也可能适合你... - Roland
显示剩余3条评论

8
"removeAt" 方法返回被移除的元素:

abstract fun removeAt(index: Int): E (source)

从列表中指定索引处移除一个元素。

返回已被移除的元素。
kotlin.stdlib / kotlin.collections.MutableList.removeAt

您正在创建一个新列表,其中只包含一个元素,即您已删除的元素。

请尝试:

val arraytwo = ArrayList(arrayone) // Copy the list
arraytwo.removeAt(0)

您从未说明您是否想修改原始列表。如果是这样的话,只需执行arrayone.removeAt(0)即可。

您还可以使用apply

val arraytwo = ArrayList(arrayone).apply { removeAt(0) }

如果您只需要删除开头或结尾的项目,可以使用 drop(用于删除开头的项目)或 dropLast,但据我所知,没有集合扩展可以在可迭代对象的中间删除一个项目(根据您的评论,您似乎需要这个功能)。这是有道理的,因为可迭代对象没有大小或索引的概念。

6

对于普通的ArrayList:

val arrList = arrayListOf("account", "bec", "csw", "account")
arrList.removeAll { it == "account" }

对于自定义 ArrayList:

arrList.removeAll { it.key == "account" }

6
如果您只想筛选出数组中的一个特定元素,可以使用.filterTo(destination, predicate)方法。对于您的例子,可以像这样实现:
val arrayone = arrayListOf<String>("a", "b", "c")
val arraytwo = arrayListOf<String>()

arrayone.filterTo(arraytwo, { it != "a" })

println(arrayone) //[a, b, c]
println(arraytwo) //[b, c]

3

试一下这个,

var arrayone: ArrayList<String> = arrayListOf("a","b","c")
arrayone.removeAt(0)
val arraytwo:ArrayList<String> = arrayListOf(arrayone)
for (item in arraytwo) {
  println(item)
}

1
from import java.utils.ArrayList

ArrayList<YourCustomObject>.removeIf{yourCustomObject ->
     yourCustomObject.Id == IdToRemove
}

1
你的回答只包含代码。我建议你不要仅仅发布代码作为答案,而是提供一个解释,说明你的代码是如何解决问题的。带有解释的答案通常更有帮助和更高质量,并且更有可能吸引赞同。 - Mark Rotteveel

-1
  val x = arrayListOf(1, 2, 3, 5)
  x.removeFirst()
  println(x)

  val y = x.filterIndexed { index, value -> index != 0 }
  println(y)

输出:

[2, 3, 5]
[3, 5]

GL

源代码


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接