Как удалить элемент из массива в Kotlin

#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 .