给定以下人员定义:
open class Person(val name: String, val age: Int)
object EmptyPerson:Person("", 0)
和以下数据:
val left = listOf(Person("Tinky-winkey", 1), Person("lala", 2))
val right = listOf(Person("Dipsy", 3), Person("Tinky-winkey", 4))
是否可以根据name属性将left
和right
列表压缩为如下结果:
val result = listOf(
Pair(Person("Tinky-winkey", 1), Person("Tinky-winkey", 4)),
Pair(Person("lala", 2), EmptyPerson),
Pair(EmptyPerson, Person("Dipsy", 3))
)
以某种方式将左侧元素保留在pair()
的左侧。
像left.zipByProperty {right, p->p.name}
这样的东西
也许zip不是正确的选择?
发布于 2021-06-14 21:49:07
除了匹配项在集合中的位置之外,zip
不处理任何匹配项。
我想这会达到你所描述的效果。最好先创建Map,以降低复杂性,除非它们总是非常短的列表。
inline fun <T, K> zipBy(first: List<T>, second: List<T>, default: T, keySelector: (T)->K): List<Pair<T, T>> {
val firstByKey = first.associateBy(keySelector)
val secondByKey = second.associateBy(keySelector)
return (firstByKey.keys + secondByKey.keys)
.map { (firstByKey[it] ?: default) to (secondByKey[it] ?: default) }
}
用法:
val result = zipBy(left, right, EmptyPerson, Person::name)
https://stackoverflow.com/questions/67971180
复制相似问题