获取 kotlin 中 2 个映射之间的差异

amp*_*amp 1 dictionary kotlin

我正在尝试检测 kotlin 中两个地图之间的差异。

我设置了以下示例,以便更轻松地解释我想要实现的目标:

fun main() = runBlocking {

    val firstMapOfAnimals = mapOf(
        Pair("key1", Dog(name = "Dog aaa")),
        Pair("key2", Dog(name = "Dog bbb", breed = "Bulldog")),
        Pair("key4", Cat(name = "Cat ddd", color = "White")),
        Pair("key5", Cat(name = "Cat eee", color = "Blue")),
        Pair("key6", Cat(name = "Cat fff", color = "Blue"))
    )

    val secondMapOfAnimals = mapOf(
        Pair("key2", Dog(name = "Dog BBB")),
        Pair("key3", Dog(name = "Dog CCC")),
        Pair("key4", Cat(name = "Cat DDD", color = "Grey")),
        Pair("key6", Dog(name = "Dog FFF", breed = "Husky"))
    )

    val diffResult = diff(firstMapOfAnimals, secondMapOfAnimals)

    val expectedResultMap = mapOf(
        Pair("key2", Dog(name = "Dog BBB", breed = "Bulldog")),
        Pair("key3", Dog(name = "Dog CCC")),
        Pair("key4", Cat(name = "Cat DDD", color = "Grey")),
        Pair("key6", Dog(name = "Dog FFF", breed = "Husky"))
    )

    println("Actual: $diffResult")
    println("Expected: $expectedResultMap")

}

private fun diff(
    firstMap: Map<String, Animal>,
    secondMap: Map<String, Animal>
): Map<String, Animal> {
    val result = mapOf<String, Animal>()
    //TODO: get differences between firstMap and secondMap
    return result
}

abstract class Animal

data class Dog(
    val name: String,
    val breed: String = "breed"
) : Animal()

data class Cat(
    val name: String,
    val color: String = "black"
) : Animal()
Run Code Online (Sandbox Code Playgroud)

我的真实代码有点复杂,但我想从简单开始。

基本上,我需要编写diff()方法体才能达到预期的打印结果。目前,这是输出:

Actual: {}
Expected: {key2=Dog(name=Dog BBB, breed=Bulldog), key3=Dog(name=Dog CCC, breed=breed), key4=Cat(name=Cat DDD, color=Grey), key6=Dog(name=Dog FFF, breed=Husky)}
Run Code Online (Sandbox Code Playgroud)

我相信这可以通过运算符组合来解决,但由于我对 kotlin 的了解仍然有限,我不确定如何实现这一点......

有人可以指出我的某个方向吗?

m0s*_*it0 5

您可以使用现有的minus()运算符扩展功能:

secondMapOfAnimals.minus(firstMapOfAnimals)
Run Code Online (Sandbox Code Playgroud)

或者更简洁地说:

secondMapOfAnimals - firstMapOfAnimals
Run Code Online (Sandbox Code Playgroud)

另请注意,您可以使用to()中缀扩展函数来创建对:

"key1" to Dog(name = "Dog aaa")
Run Code Online (Sandbox Code Playgroud)

代替

Pair("key1", Dog(name = "Dog aaa"))
Run Code Online (Sandbox Code Playgroud)