#android #kotlin
#Android #kotlin
Вопрос:
Я пытаюсь удалить элемент из массива следующим образом:
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
// Inflate the layout for this fragment
gView = inflater.inflate(R.layout.fragment_add_new_load_amount, container, false)
loadAmountString = SharedForSettings.getInstance(context!!).loadAmounts
loadAmounts = loadAmountString!!.split(",").toTypedArray()
return gView
}
private fun removeValue(value: String) {
for (i in 0 until loadAmounts!!.size) {
if (loadAmounts!![i].equals(value)) {
loadAmounts!!.drop(i)
}
}
loadAmounts!![0]
}
но этот код не работает. Как я могу это исправить?
Комментарии:
1. Где это
loadAmounts
определено?2. @Edric Пожалуйста, посмотрите мою правку, сэр
3. Обычно предпочтительнее работать со списками и изменяемыми списками, а не с массивом.
MutableList
removeValue
функция уже есть, поэтому вам не нужно реализовывать ее самостоятельно.
Ответ №1:
Причина, по которой это не работает, заключается в том, что drop
удаляются первые n
элементы. Поэтому, если вы это сделаете drop(5)
, результатом будет массив без первых 5 элементов. Последняя строка в методе является обычной get
, поэтому на самом деле она ничего не удаляет.
К сожалению, массивы в kotlin не имеют remove
метода. Есть много возможностей решить эту проблему.
Одно, что приходит на ум после прочтения вашего кода, — это не вызывать toTypedArray()
. Метод split
уже возвращает a List<String>
, в котором есть метод remove
, который можно вызвать с элементом, который вы хотите удалить.
Если вы действительно хотите сохранить его в виде массива, то вам нужно реализовать метод remove самостоятельно. Что-то вроде, например:
inline fun <reified T> Array<T>.removeValue(value: T) =
filterNot { it == value }.toTypedArray()
Это пройдет через массив и удалит все элементы, соответствующие переданному значению. Вы можете использовать его как loadAmounts.removeValue("two")
, что бы удалить все экземпляры значения "two"
. Работает и для других типизированных массивов.
Опять же, есть много способов сделать это. Я просто хотел подчеркнуть, что вы также можете переключиться на List<String
.
Комментарии:
1. На мой взгляд, имя функции не должно быть «удалить», потому что это означает, что она редактирует коллекцию на месте. Вот что это значит для MutableList. Может быть, что-то вроде
toArrayWithout
.