kotlin - 有没有办法合并来自 Kotlin 列表中不同(但相似)对象的值?

标签 kotlin

好的,我有一个 list<SomeObject>

class SomeObject(
  val number: Int,
  val otherNumber: Int,
  val list<OtherObject>
)
列表中的对象可以具有相同的 numberotherNumber但它们的 list<OtherObject> 中的值不同
我想用相同的 number 合并列表中的每个对象和 otherNumber .例如,如果我有一个 list<SomeObject>有 3 个条目:
1 = SomeObject(1, 1, list<OtherObject>2 = SomeObject(1, 1, list<OtherObject>3 = SomeObject(1, 2, list<OtherObject>我希望条目 1 和 2 成为一个列表条目,两个列表的值相结合。
我可以用很多循环和东西来做到这一点,但是列表超长,我似乎无法以有效的方式做到这一点。
是否有一些 kotlin 功能?或者有人对我应该如何处理它有很好的建议吗?

最佳答案

也许这对您来说是一个合适的解决方案。而不是 List<OtherObject>我用了 List<String>但这应该没什么区别。
您可能需要考虑包装您的 List<SomeObject>Sequence建立一个一次性执行的过滤器,而不是实际应用 groupBy等等到 List .另请引用 https://kotlinlang.org/docs/sequences.html
有关解释,请检查代码中的注释。

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"
    }
}

关于kotlin - 有没有办法合并来自 Kotlin 列表中不同(但相似)对象的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67300942/

相关文章:

android - 测试 Android Kotlin 应用程序 - 使用 Dagger 的 Mockito 注入(inject) null

android - Kotlin ViewModel字符串列表

java - 过滤机会枚举并根据随机机会选择一个

asynchronous - 如何异步对 Kotlin 中的多个项目执行网络请求?

algorithm - Kotlin 默认使用什么样的排序?

android - 无法初始化 GeckoRuntime |壁虎 View |安卓

Android Mockito kotlin.UninitializedPropertyAccessException : lateinit property dataManager has not been initialized

android - Compose 使用 Flow<T>.collectAsState render List<T> LazyColumn progressive

java - 如何从 firebase 检索键和值并将它们存储在两个单独的变量中

android - 使用 dagger 2 时 JWT token 不会更新?