kotlin将映射列表缩减为单个映射

kotlin将映射列表缩减为单个映射,kotlin,Kotlin,我如何减少 val res = [{a=3}, {a=2, c=1}] 进入 ? 我尝试了groupBy函数,但没有得到想要的结果。我想汇总相同键的值。要求和冲突值,可以使用x.asSequence().flatMap{it.asSequence()}.groupBy{it.key}.mapValues{it.value.asSequence().map{it.value}.sum(),导致{a=5,c=1}要求和冲突值,可以使用x.asSequence().flatMap{it.asSequ

我如何减少

val res = [{a=3}, {a=2, c=1}]
进入

?


我尝试了groupBy函数,但没有得到想要的结果。我想汇总相同键的值。

要求和冲突值,可以使用
x.asSequence().flatMap{it.asSequence()}.groupBy{it.key}.mapValues{it.value.asSequence().map{it.value}.sum()
,导致
{a=5,c=1}
要求和冲突值,可以使用
x.asSequence().flatMap{it.asSequence()}.groupBy{it.key}.mapValues{it.value.asSequence().map{it.value}.sum()}
,导致
{a=5,c=1}

最简单的方法是迭代列表。像这样:

val input = listOf(
    mapOf(
        "a" to 2
    ),
    mapOf(
        "a" to 3,
        "c" to 1
    )
)

val result = mutableMapOf<String, Int>()
input.forEach { map ->
    map.forEach { (key, value) ->
        result[key] = result.getOrElse(key, { 0 }) + value
    }
}
val输入=listOf(
地图(
a至2
),
地图(
"a"至"3",,
“c”至1
)
)
val result=mutableMapOf()
input.forEach{map->
map.forEach{(键,值)->
result[key]=result.getOrElse(key,{0})+值
}
}

最简单的方法是迭代列表。像这样:

val input = listOf(
    mapOf(
        "a" to 2
    ),
    mapOf(
        "a" to 3,
        "c" to 1
    )
)

val result = mutableMapOf<String, Int>()
input.forEach { map ->
    map.forEach { (key, value) ->
        result[key] = result.getOrElse(key, { 0 }) + value
    }
}
val输入=listOf(
地图(
a至2
),
地图(
"a"至"3",,
“c”至1
)
)
val result=mutableMapOf()
input.forEach{map->
map.forEach{(键,值)->
result[key]=result.getOrElse(key,{0})+值
}
}

您可以使用
折叠
操作符

比如说

val list=listOf(mapOf(“a”到3),mapOf(“a”到2,c”到1))
val res=list.fold(mutableMapOf()){acc,v->
v、 forEach{(键,值)->
如果(附件包含(键)){
acc[键]=acc[键]!!+值
}否则{
acc[键]=值
}
}
行政协调会
}
或通过
reduce
操作员:

val res=list.reduce{acc,map->
val res=根据toMutableMap()计算
map.forEach{(键,值)->
res[key]=res.getOrDefault(key,0)+值
}
物件
}
groupBy
sumBy
运算符

val res=list.flatMap{it.entries}
.groupBy{it.key}
.mapValues{it.value.sumBy{v->v.value}

您可以使用
折叠
操作符

比如说

val list=listOf(mapOf(“a”到3),mapOf(“a”到2,c”到1))
val res=list.fold(mutableMapOf()){acc,v->
v、 forEach{(键,值)->
如果(附件包含(键)){
acc[键]=acc[键]!!+值
}否则{
acc[键]=值
}
}
行政协调会
}
或通过
reduce
操作员:

val res=list.reduce{acc,map->
val res=根据toMutableMap()计算
map.forEach{(键,值)->
res[key]=res.getOrDefault(key,0)+值
}
物件
}
groupBy
sumBy
运算符

val res=list.flatMap{it.entries}
.groupBy{it.key}
.mapValues{it.value.sumBy{v->v.value}

对于问题中的实际问题,已经有很多答案,但是如果这些地图是项目计数,并且您自己生成它们,那么您可能需要创建s

然后您可以使用和一个映射来建立每个键的计数

val counts = grouped.fold(mutableMapOf<Char, Int>()) { countMap, grouping ->
    grouping.eachCountTo(countMap)
    countMap
}
print(counts)

>> {a=5, c=1}
val counts=grouped.fold(mutableMapOf()){countMap,grouping->
分组。每个计数(计数图)
计数图
}
打印(计数)
>>{a=5,c=1}

很高兴知道它的存在,无论如何

对于问题中的实际问题,已经有很多答案,但是如果这些地图是项目的计数,并且您自己生成它们,那么您可能需要创建s

然后您可以使用和一个映射来建立每个键的计数

val counts = grouped.fold(mutableMapOf<Char, Int>()) { countMap, grouping ->
    grouping.eachCountTo(countMap)
    countMap
}
print(counts)

>> {a=5, c=1}
val counts=grouped.fold(mutableMapOf()){countMap,grouping->
分组。每个计数(计数图)
计数图
}
打印(计数)
>>{a=5,c=1}

很高兴知道它的存在,无论如何

您可以使用Map.putAll减少。你不是说你想如何解决冲突,though@njzk2编辑了问题。相关:
res
是一个地图列表吗?Kotlin没有集合文字,因此显示的代码不能是真实的。@AbhijitSarkar您可以使用
listOf(mapOf('a'到3),mapOf('a'到2,'c'到1))
,这会导致打印时出现
[{a=3},{a=2,c=1}]
。您可以使用Map.putAll进行缩减。你不是说你想如何解决冲突,though@njzk2编辑了问题。相关:
res
是一个地图列表吗?Kotlin没有集合文字,因此显示的代码不能是真实的。@AbhijitSarkar您可以使用
listOf(mapOf('a'到3),mapOf('a'到2,'c'到1))
,这会导致打印时出现
[{a=3},{a=2,c=1}]
。这不会处理冲突。我编辑了这个问题。我希望具有相同键的值summed@max_mal我已修复了对冲突键求和的答案。这不会处理冲突。我编辑了问题。我希望具有相同键的值summed@max_mal我已经确定了我的答案,以解决相互冲突的问题。