【问题标题】:How to combine two object lists by id and select non-null values in kotlin如何通过id组合两个对象列表并在kotlin中选择非空值
【发布时间】:2021-01-21 17:45:17
【问题描述】:

我想合并两个对象列表。每个对象都有一个特定的 ID。如果两个列表中存在同一个对象,我想合并它们。如果一个值为空,我想获得非空值。例如:

val list1 = listOf(
    Object(id = 1, hello, 100),
    Object(id = 2, null, 40)
)

val list2 = listOf(
    Object(id = 1, null, 100),
    Object(id = 2, test, 40),
    Object(id = 3, hi, 13)
)

我想要达到的结果如下:

val result = listOf(
    Object(id = 1, hello, 100),
    Object(id = 2, test, 40),
    Object(id = 3, hi, 13)
)

注意:如果一个值不为空,我知道它没有不同。

【问题讨论】:

  • 列表中是否只有唯一值或者可以重复?例如val list1 = listOf(Object(id = 1, null, 100), Object(id = 1, hello, 100))
  • 只有唯一值
  • 您的代码无法编译。请提供Minimal, Reproducible Example

标签: java android list kotlin merge


【解决方案1】:
fun main() {
    val list1 = listOf(
        Obj(id = 1, "hello", 100),
        Obj(id = 2, null, 40)
    )

    val list2 = listOf(
        Obj(id = 1, null, 100),
        Obj(id = 2, "test", 40),
        Obj(id = 3, "hi", 13)
    )

    val result = (list1.asSequence() + list2)
        .groupingBy { it.id }
        .reduce { _, accumulator: Obj, element: Obj ->
            accumulator.copy(second = accumulator.second ?: element.second)
        }
        .values.toList()

    println(result)
}

data class Obj(val id: Int, val second: String?, val third: Int)

【讨论】:

  • 很好,我知道groupBy,但不知道groupingBy。也许asSequence() 不是必须的?
【解决方案2】:

可以有两种方法来解决这个问题,O(n^2) 方法,您可以循环遍历两个列表并检查每个对象。或者 O(n) 方法,通过在一个字典中为您的列表创建映射并在签入另一个字典时循环其中一个来浪费一些额外空间。

【讨论】:

  • 你能给出一个代码示例吗?我不知道该怎么做。
  • 我不精通 kotlin 但是我可以给你同样的伪代码
猜你喜欢
  • 2017-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-04
  • 1970-01-01
  • 2015-04-12
相关资源
最近更新 更多