Сравнение и замена элементов в двух списках разных размеров в Kotlin? - PullRequest
0 голосов
/ 26 ноября 2018

У меня есть следующая функция:

override fun insertUpdatedItems(items: List<AutomobileEntity>) {
        if (!items.isEmpty()) {
            items.forEachIndexed { index, automobileEntity ->
                if (automobileEntity.id == items[index].id) {
                    automobileCollection[index] = items[index]
                    notifyItemInserted(index)
                }
            }
        }
    }

Я использую для предоставления данных для просмотра переработчика, я пытаюсь вставить обновленные / отредактированные элементы, которые уже находятся в automobileCollection, размер которого всегда возвращается10 элементов, но список items может отличаться, может быть от 1 до 10.

Предполагается сравнить элементы по id, но в настоящее время я получаю эту функцию с помощьюОтредактированные элементы просто вставляются в адаптер переработчика и не рассматриваются как уже существующий элемент.

Напротив, если я выполняю итерацию с использованием automobileCollection, я получаю IndexOutOfBoundsException, поскольку в большинстве случаев список items меньше, чем automobileCollection.

1 Ответ

0 голосов
/ 26 ноября 2018

Чтобы обновить список элементами из другого, вы можете использовать несколько способов.

Сначала начните с прямой замены (которая сохраняет порядок, но это только деталь):

val sourceList = TODO()
val targetList = TODO()

targetList.replaceAll { targetItem -> 
  sourceList.firstOrNull { targetItem.id == it.id } 
            ?: targetItem
}

В качестве альтернативы можно удалить все элементы и добавить их снова:

targetList.removeIf { targetItem ->
  sourceList.any { it.id == targetItem.id }
}
targetList.addAll(sourceList)

Использование listIterator (обратите внимание! Это на самом деле также происходит, когда вы вызываете replaceAll ... не таким же образом, нопохоже; -)):

val iterator = targetList.listIterator()
while (iterator.hasNext()) {
  iterator.next().apply {
    sourceList.firstOrNull { id == it.id }?.also(iterator::set)
  }
}

Наверное, не так читабельно ... Для вашего forEachIndexed Я не вижу ни одного варианта использования.Для других проблем определенно есть, но я бы посоветовал вам стараться опускать индексы (а также forEach) так часто, как вы можете.Если вам ничего не приходит в голову, то forEach тоже хорошо, но часто 1011 * (а тем более forEachIndexed) не лучший подход для решения проблемы.

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