Как удалить элемент из ArrayList в Котлине - PullRequest
0 голосов
/ 27 сентября 2018
var arrayone: ArrayList<String> = arrayListOf("a","b","c")

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

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

Я просто хочу удалить элемент из первого массива и создать новый массив.Но это просто печатает один элемент с индексом 0

Ответы [ 3 ]

0 голосов
/ 27 сентября 2018

попробуйте,

var arrayone: ArrayList<String> = arrayListOf("a","b","c")
arrayone.removeAt(0)
val arraytwo:ArrayList<String> = arrayListOf(arrayone)
for (item in arraytwo) {
  println(item)
}
0 голосов
/ 27 сентября 2018

removeAt(0) удаляет первый элемент из первого списка и возвращает его.arrayListOf затем использует этот удаленный элемент для создания нового (второго) списка.

arrayone, затем содержит: b и c.arraytwo затем содержит 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

Используя filterIndexed, filter, drop и т. Д.убедитесь, что первый список остался нетронутым.Если вы не хотите трогать первый список в первую очередь, вы можете использовать listOf или toList, то есть просто List как тип вместо этого, который не предоставляет изменяемые функции (см. Также Ссылка Kotlin относительно коллекций: список, набор, карта ).

Возможно, вас также интересует filter / filterNot, а затем вскоре в minus или аналогичных функциях для удаления ненужных элементов без индекса.

0 голосов
/ 27 сентября 2018

removeAt возвращает удаленный элемент:

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

Удаляет элемент по указанному индексу из списка.

Return элемент, который был удален.
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, но, насколько я знаю, не существует расширения коллекции, чтобы отбрасывать элемент в середине итерируемого (и, судя по вашему комментарию,Похоже, вам это нужно.) Это имеет смысл, поскольку итерируемое не имеет понятия размера или индекса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...