dictionary - 获取 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 的了解仍然有限,我不确定如何实现这一点......
有人可以指出我的方向吗?
解决方案
您可以使用现有的minus()
运营商扩展功能:
secondMapOfAnimals.minus(firstMapOfAnimals)
或更简洁地说:
secondMapOfAnimals - firstMapOfAnimals
另请注意,您可以使用中to()
缀扩展功能来创建对:
"key1" to Dog(name = "Dog aaa")
代替
Pair("key1", Dog(name = "Dog aaa"))
推荐阅读
- django - Django:获取第二个用户对象
- html - 宽度变化时进度点的位置没有正确对齐
- php - 使用 Laravel 在控制器中使用私有变量
- javascript - 展开和折叠 HTML 表数据行
- python - 试图改变列表失败
- streamlit - 有没有办法在流光中更改微调器的占位符文本?
- php - laravel中api的更新方法不起作用
- vue.js - 在 vue 中检测 tbody 上的滚动
- firebase - SwiftUI:Firebase ForEach 列表执行编辑功能无法编辑选定的行项目
- c - 在 C 中将静态大小的向量与静态大小的常量非方阵相乘的最快方法,生成一个 15 元素的输出向量