比较和替换Kotlin中大小不同的两个列表中的项目?

时间:2018-11-26 08:58:35

标签: android list collections kotlin

我具有以下功能:

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)
                }
            }
        }
    }

我一直在为recyclerview提供数据,我试图插入已在automobileCollection中的已更新/编辑过的项目,其大小始终会返回10个项目,但items列表可能与110不同。

本来应该按id比较项目,但是我当前使用此功能得到的是已编辑的项目只是插入到recyclerview的适配器中,而不被视为已经存在的项目。

相反,如果我使用automobileCollection进行迭代,则会得到IndexOutOfBoundsException,因为在大多数情况下,items列表小于automobileCollection

1 个答案:

答案 0 :(得分:2)

要使用另一个列表中的项目更新列表,可以使用几种方法。

首先从直接替换开始(保留订单,但这只是一个细节):

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也是可以的,但是很多时候forEach(甚至更多forEachIndexed)都不是解决问题的最佳方法。 / p>