首页 > 解决方案 > 获取 kotlin 中 2 个地图之间的差异

问题描述

我正在尝试检测 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()

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

基本上,我需要编写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)}

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

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

标签: dictionarykotlin

解决方案


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

secondMapOfAnimals.minus(firstMapOfAnimals)

或更简洁地说:

secondMapOfAnimals - firstMapOfAnimals

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

"key1" to Dog(name = "Dog aaa")

代替

Pair("key1", Dog(name = "Dog aaa"))

推荐阅读