首页 > 解决方案 > Kotlin:比较两个不同大小的不同列表以找到共享值并在发生时更改元素

问题描述

给定列表 A 包含以下数据:

arrayListOf(Product(uid = "1", name = "Product 1", isOnListB = false), Product(uid = "2", name = "Product 2", isOnListB = false), Product(uid = "3", name = "Product 3", isOnListB = false))

列表 B 包含以下内容:

arrayListOf(FavoriteProduct(uid = "2", dateAdded = "Today"))

Kotlin 查看列表 A 上的产品是否在列表 B 上然后对该产品进行更改的惯用方式是什么?

在上面的示例中,您可以看到两个列表都包含不同的数据类型,并且它们共享的唯一可以相同的数据是uid属性。

只要uid两个列表上有相同的值,则列表 A 中的相应元素应更新为位于列表 B ( isOnListB) 上。

标签: kotlin

解决方案


设置:

data class Product(val uid: String, val name: String, var isOnListB: Boolean)
data class FavoriteProduct(val uid: String, val dateAdded: String)
val prods = arrayListOf(Product(uid = "1", name = "Product 1", isOnListB = false), Product(uid = "2", name = "Product 2", isOnListB = false), Product(uid = "3", name = "Product 3", isOnListB = false))
val favs = arrayListOf(FavoriteProduct(uid = "2", dateAdded = "Today"))

简单的O(|favs| |prods|)解决方案:

prods.forEach { prod ->
    if (favs.any { fav -> prod.uid == fav.uid })
        prod.isOnListB = true
}

尽管正如其他人所提到的,将产品存储为 HashMap 可能更有效,甚至只是在用户添加产品时对其进行更新。


推荐阅读