kotlin - 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
) 上。
解决方案
设置:
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 可能更有效,甚至只是在用户添加产品时对其进行更新。
推荐阅读
- c# - 每个 cefsharp 实例的不同 javascript 导航器对象
- mercurial - 新创建的存储库中的 Arc diff 引发异常“hg:解析错误:空查询”
- java - 在 Java 中处理 INR 货币的正确方法
- mysql - 我的查询不为空,即使在 mysql 数据库中为空,这里的正确语法是什么?
- laravel - Laravel如何从数据库下载txt文件
- sql - 仅选择表 A 中比表 B 中的实际日期更近的预测数据
- javascript - 部分 SPA 应用,历史导航在视口中呈现 JSON
- c++11 - 如何获取当前时间的亚秒
- oracle - 如何在 oracle apex 交互式报告中选择记录 ID
- perl - 只匹配两次