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

有没有办法合并Kotlin列表中不同(但相似)对象的值?,kotlin,Kotlin,好的,我有一个列表 class-SomeObject( val编号:Int, val otherNumber:Int, val列表 ) 列表中的对象可以具有相同的编号和其他编号,但其列表中的值不同 我想将列表中的每个对象与相同的编号和其他编号合并。例如,如果我有一个包含3个条目的列表: 1=SomeObject(1,1,list 2=SomeObject(1,1,list 3=SomeObject(1,2,list 我希望条目1和条目2成为一个列表条目,两个列表的值合并在一起 我可以用很多循环

好的,我有一个
列表

class-SomeObject(
val编号:Int,
val otherNumber:Int,
val列表
)
列表中的对象可以具有相同的
编号
其他编号
,但其
列表中的值不同

我想将列表中的每个对象与相同的
编号
其他编号
合并。例如,如果我有一个包含3个条目的
列表

1=
SomeObject(1,1,list

2=
SomeObject(1,1,list

3=
SomeObject(1,2,list

我希望条目1和条目2成为一个列表条目,两个列表的值合并在一起

我可以用很多循环之类的东西来完成这个任务,但是列表太长了,我似乎不能以一种有效的方式来完成


是否有一些kotlin函数用于此?或者有人对我应该如何处理它有好的建议吗?

也许这将是一个适合您的解决方案。我使用了一个
列表来代替
,但这不会有什么区别

您可能想考虑将<<代码>列表>代码>到<代码>序列< /代码>中,建立一个同时执行的筛选器,而不是实际应用<代码> GROPPB/<代码>等到List< /C>。 有关解释,请查看代码中的注释

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"
    }
}
fun main(){
val objects=listOf(
SomeObject(1,1,listOf(“a”)),
SomeObject(1,1,listOf(“b”)),
SomeObject(1,2,listOf(“c”))
//按编号和其他编号对所有对象进行分组(两者必须匹配)
val grouping=objects.groupBy{Pair(it.number,it.otherNumber)}
//将分组合并到新对象上,以便
//[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”])]
//变成
//列表(一些对象(1,1,[“a”、“b”、“c”、“d”)、一些对象(2,1,[“e”、“f”、“g”、“h”))
val consolidated=grouping.values.map{
objectsWithSameNumber->
SomeObject(objectsWithSameNumber[0]。编号,
objectsWithSameNumber[0]。otherNumber,
objectsWithSameNumber.flatMap{it.list})
}
/*
1[a,b]
1.2:[c]
*/
对于(合并结果){
println(结果)
}
}
类对象(
val编号:Int,
val otherNumber:Int,
val列表:列表
){
重写funtostring():String{
返回“$number$otherNumber:$list”
}
}

<代码>我想我们可以删除Android标签,如果只是KTLIN更多的人可以看到它,并给你一个更好的答案。也许考虑使用一个基于数字和其他数字的哈希设置。我同意@ USE223 3706。构建一个<代码> map <代码>或类似的东西有很多意义。非常感谢!它对于示例场景来说是非常好的。wever,对于真正的列表,我和以前一样内存不足。因此,我想我必须做一些完全不同的事情。无论如何,我都会接受这个答案,因为它回答了示例问题。@Skretinga Well-我的解决方案将为每个
数字
其他数字
组合创建新对象。也许你想这样做考虑在合并后重用其中一个对象并丢弃其他对象。
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"
    }
}