好的,我有一个list<SomeObject>
class SomeObject(
val number: Int,
val otherNumber: Int,
val list<OtherObject>
)列表中的对象可以具有相同的number和otherNumber,但其list<OtherObject>中的值不同
我想用相同的number和otherNumber合并列表中的每个对象。例如,如果我有一个包含3个条目的list<SomeObject>:
1= SomeObject(1, 1, list<OtherObject>
2= SomeObject(1, 1, list<OtherObject>
3= SomeObject(1, 2, list<OtherObject>
我希望条目1和2成为一个合并了两个列表的值的列表条目。
我可以通过大量的循环和其他东西来做到这一点,但是列表太长了,而且我似乎不能以一种有效的方式做到这一点。
有没有什么kotlin函数?或者,有没有人对我应该如何处理它有一个好的建议?
发布于 2021-04-28 21:56:21
也许这将是一个适合你的解决方案。我使用的是List<String>而不是List<OtherObject>,但这不会有什么不同。
您可能需要考虑将List<SomeObject>包装到Sequence中,以构建一个一次性执行的过滤器,而不是对List实际应用groupBy,依此类推。另请参阅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"
}
}https://stackoverflow.com/questions/67300942
复制相似问题