首页 > 解决方案 > 如何计算 Scala 嵌套 Map 中元素的出现次数?

问题描述

我想找到一种有效的方法来计算位于两级映射中的列表中元素的出现次数。

内部映射可能具有其中的非唯一键,例如deep1存在shallow1shallow2. 向量之间可能存在非唯一值。例如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)

标签: scalafunctional-programminghashmap

解决方案


另一种解决方案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)
    }
  }
}

推荐阅读