Я хочу объединить два списка объектов. У каждого объекта есть определенный идентификатор. Если один и тот же объект существует в двух списках, я хочу их объединить. И если значение равно нулю, я хочу получить ненулевое значение. Например:

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

ПРИМЕЧАНИЕ. Если значение не пустое, я знаю, что оно не отличается.

1
Murat AKSU 6 Окт 2020 в 22:36

2 ответа

Лучший ответ
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)
1
IR42 6 Окт 2020 в 20:42

Может быть 2 подхода к проблеме: подход O (n ^ 2), при котором вы просматриваете оба списка и проверяете каждый объект. Или подход O (n), когда вы тратите лишнее пространство, создавая сопоставление в одном словаре для своего списка и зацикливаясь на одном, проверяя другой.

0
avisionx 6 Окт 2020 в 19:41