如何从Kotlin中的ArrayList中删除项目

Sel*_*dız 4 arrays kotlin

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

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

for (item in arraytwo) {
  println(item)
}
Run Code Online (Sandbox Code Playgroud)

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

Rol*_*and 6

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
Run Code Online (Sandbox Code Playgroud)

或者,dropLast(1)如果您只想删除最后一项,请使用。或使用dropWhile/ dropLastWhile如果您有条件申请并删除所有直到/直到该条件...

如果您确实要从第一个列表中删除项目,并且仅将已删除的项目添加到第二个列表中,那么您当前的方法是可以的。但是,如果您想删除特定索引处的项目并有一个新列表而不是仅包含未删除的列表,则需要先构造第一个列表的副本,然后将其应用于removeAt该列表,例如:

val arraytwo = arrayone.toMutableList().apply { 
  removeAt(0)
}
// or without the apply:
arraytwo.removeAt(0)
Run Code Online (Sandbox Code Playgroud)

或者您可以使用以下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
Run Code Online (Sandbox Code Playgroud)

通过使用filterIndexedfilterdrop等你保证第一列表保持不变。如果您不想首先触摸第一个列表,则不妨使用listOftoList,即List改用as类型,该类型不公开可变函数(另请参阅Kotlin参考资料,了解Collections:List,Set,Map))。

也许您也对filter/ 感兴趣,filterNot然后很快对minus或类似功能感兴趣,以删除不需要索引的不需要的项目。


Tri*_*ler 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]
Run Code Online (Sandbox Code Playgroud)


Aha*_*kat 6

对于普通数组列表:

val arrList = arrayListOf("account", "bec", "csw", "account")
arrList.removeAll { it == "account" }
Run Code Online (Sandbox Code Playgroud)

对于自定义数组列表:

arrList.removeAll { it.key == "account" }
Run Code Online (Sandbox Code Playgroud)


Moi*_*ira 5

removeAt 返回移除的元素:

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

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

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

您正在使用一个元素创建一个新列表,即您删除的元素。

尝试:

val arraytwo = ArrayList(arrayone) // Copy the list
arraytwo.removeAt(0)
Run Code Online (Sandbox Code Playgroud)

您从未澄清是否要修改原始列表。如果你这样做,就这样做arrayone.removeAt(0)。就是这样。

您还可以使用apply

val arraytwo = ArrayList(arrayone).apply { removeAt(0) }
Run Code Online (Sandbox Code Playgroud)

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