首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >有没有办法在Kotlin的list中合并不同(但相似)对象的值?

有没有办法在Kotlin的list中合并不同(但相似)对象的值?
EN

Stack Overflow用户
提问于 2021-04-28 21:13:03
回答 1查看 83关注 0票数 2

好的,我有一个list<SomeObject>

代码语言:javascript
运行
复制
class SomeObject(
  val number: Int,
  val otherNumber: Int,
  val list<OtherObject>
)

列表中的对象可以具有相同的numberotherNumber,但其list<OtherObject>中的值不同

我想用相同的numberotherNumber合并列表中的每个对象。例如,如果我有一个包含3个条目的list<SomeObject>

1= SomeObject(1, 1, list<OtherObject>

2= SomeObject(1, 1, list<OtherObject>

3= SomeObject(1, 2, list<OtherObject>

我希望条目1和2成为一个合并了两个列表的值的列表条目。

我可以通过大量的循环和其他东西来做到这一点,但是列表太长了,而且我似乎不能以一种有效的方式做到这一点。

有没有什么kotlin函数?或者,有没有人对我应该如何处理它有一个好的建议?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-04-28 21:56:21

也许这将是一个适合你的解决方案。我使用的是List<String>而不是List<OtherObject>,但这不会有什么不同。

您可能需要考虑将List<SomeObject>包装到Sequence中,以构建一个一次性执行的过滤器,而不是对List实际应用groupBy,依此类推。另请参阅https://kotlinlang.org/docs/sequences.html

如需解释,请查看代码中的注释。

代码语言:javascript
运行
复制
fun main() {
    val objects = listOf(
            SomeObject(1, 1, listOf("a")),
            SomeObject(1, 1, listOf("b")),
            SomeObject(1, 2, listOf("c")))


    // group all objects by number and othernumber (both have to match)
    val grouping = objects.groupBy { Pair(it.number, it.otherNumber) }

    // consolidate a grouping onto a new object, so
    // [Pair(1,1), List(SomeObject(1,1,["a","b"]), SomeObject(1,1,["c","d"])) ]
    // [Pair(2,1), List(SomeObject(2,1,["e","f"]), SomeObject(2,1,["g","h"])) ]
    // becomes
    // List(SomeObject(1,1,["a","b", "c", "d"]), SomeObject(2,1,["e","f", "g", "h"]))
    val consolidated = grouping.values.map {
        objectsWithSameNumber ->
        SomeObject(objectsWithSameNumber[0].number,
                   objectsWithSameNumber[0].otherNumber,
                   objectsWithSameNumber.flatMap { it.list })
    }

    /*
    1 1: [a, b]
    1 2: [c]
     */
    for (result in consolidated) {
        println(result)
    }
}

class SomeObject(
        val number: Int,
        val otherNumber: Int,
        val list: List<String>
){
    override fun toString(): String {
        return "$number $otherNumber: $list"
    }
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67300942

复制
相关文章

相似问题

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