kotlin - 根据属性对象将列表的属性合并到另一个列表

标签 kotlin data-structures

我有 2 个列表,其中包含 x 个对象,例如:

data class Model(
    var token: String = "",
    var id: String = "",
    var name: String = "",
    var image: Int = 0,
) 

数组已初始化并填充,另一个列表也有 x 个对象,其中也包含第一个列表的对象,但其属性具有不同的值!

我想要做的是,如果第二个数组具有相同的 object.name,则更改第一个数组的属性

var arr1 = ArrayList<Model>() // locale  
var arr2 = ArrayList<Model>() // from db 

例如我得到的第一个数组

[Model(name = "David", token = "" , image = 0)]

我得到的第二个数组

[Model(name = "David", token = "1asd5asdd851", image = 1)]

如何使第一个数组获取丢失的标记?

我尝试使用 .filter{}.map{}groupBy {} 几个小时,因为 Name 是唯一相同的属性,但我越来越困惑。

最佳答案

我们可以首先使用 associateBy() 按名称对第二个数组进行分组然后迭代第一个数组并重新分配属性:

val arr2ByName = arr2.associateBy { it.name }
arr1.forEach { item1 ->
    arr2ByName[item1.name]?.let { item2 ->
        item1.token = item2.token
        item1.image = item2.image
    }
}

或者,如果您不需要修改 arr1 中的项目,但创建另一个数组,则可以使用 arr1arr2 中的项目code>,那么就容易多了:

val arr3 = arr1.map { arr2ByName[it.name] ?: it }

关于kotlin - 根据属性对象将列表的属性合并到另一个列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70841302/

相关文章:

java - 将文本文件输入到数组中,将文本文件中的数据随机化到数组中,将随机数据输出到单独的文本文件中

c - 如何在 C 中的结构中设置一个字符?

algorithm - 采访 : Renaming all files in a directory using a data structure

android - e:无法解析以下类的父类(super class)型。请确保您在类路径中具有必需的依赖项:

android - 无法在使用 Kotlin 的方法调用中为接口(interface)传递 lambda(就像 setOnClickListener 的做法一样)

kotlin - HiveMQ MQTT 客户端 : subscribe to multiple topics

c++ - 我如何在 C++ 中将双(**)指针用于一般树数据结构?

提供完美哈希的 Java 库?

kotlin - 错误:使用提供的参数无法调用以下任何函数

android - 仅使用 Maven 使用 Kotlin 的 Android 资源扩展