scala - 如何计算 Scala 嵌套 Map 中元素的出现次数?
问题描述
我想找到一种有效的方法来计算位于两级映射中的列表中元素的出现次数。
内部映射可能具有其中的非唯一键,例如deep1
存在shallow1
于shallow2
. 向量之间可能存在非唯一值。例如1
发生在shallow1 -> deep1
并且shallow2 -> deep1
每个向量本身没有重复值。
例如,对于以下地图,
val twoLevelMap: Map[String, Map[String, Vector[Int]]] = Map(
"shallow1" -> Map(
"deep1" -> Vector(1, 3, 7),
"deep2" -> Vector(3, 8)),
"shallow2" -> Map(
"deep1" -> Vector(1, 2),
"deep4" -> Vector(7, 8, 9)))
我希望得到
地图(1 -> 2, 2 -> 1, 3 -> 2, 7 -> 2, 8 -> 2, 9 -> 1)
解决方案
另一种解决方案2.13
尽可能通用(和高效)。
(您可以2.12
通过更改updatedWith
和轻松地调整它以进行处理IterableOnce
)。
def countInnerValues[T, C[x] <: IterableOnce[x]](nestedMap: Map[String, Map[String, C[T]]]): Map[T, Int] = {
val iterator = for {
innerMaps <- nestedMap.valuesIterator
innerValues <- innerMaps.valuesIterator
value <- innerValues.iterator
} yield value
iterator.foldLeft(Map.empty[T, Int]) { (acc, t) =>
acc.updatedWith(key = t) {
case Some(count) => Some(count + 1)
case None => Some(1)
}
}
}
推荐阅读
- cloudkit - 错误 CloudKit 仪表板 - 加载环境状态时出现问题
- javascript - 将自定义标记放在 markerclusterer
- camera - 如何在 aframe 中的 gltf 中使用内部摄像头?
- javascript - 显示页面时如何激活菜单按钮?
- arrays - 我想使用 html 中的用户输入字段中的文本在 javascript 中构建一个数组,并让它出现在带有 .push 的 ap 标记中。如何?
- next.js - 为每个用户的不同项目添加条带订阅
- python - 在列表中查找连续月份
- docker - 创建大量容器时,docker containerwait api 是否存在错误?
- javascript - 将点击事件放在html按钮或父组件上更好吗?
- vue.js - Vue 路由器没有路由到我的页面 - 它返回无法获取 /home