首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >按类属性压缩2个kotlin列表

按类属性压缩2个kotlin列表
EN

Stack Overflow用户
提问于 2021-06-14 21:31:21
回答 1查看 51关注 0票数 0

给定以下人员定义:

代码语言:javascript
运行
复制
open class Person(val name: String, val age: Int)
object EmptyPerson:Person("", 0)

和以下数据:

代码语言:javascript
运行
复制
val left = listOf(Person("Tinky-winkey", 1), Person("lala", 2))
val right = listOf(Person("Dipsy", 3), Person("Tinky-winkey", 4))

是否可以根据name属性将leftright列表压缩为如下结果:

代码语言:javascript
运行
复制
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不是正确的选择?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-06-14 21:49:07

除了匹配项在集合中的位置之外,zip不处理任何匹配项。

我想这会达到你所描述的效果。最好先创建Map,以降低复杂性,除非它们总是非常短的列表。

代码语言:javascript
运行
复制
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) }
}

用法:

代码语言:javascript
运行
复制
val result = zipBy(left, right, EmptyPerson, Person::name)
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67971180

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档