gpt4 book ai didi

scala - 嵌套 map 最内层 map 上的 mapValues

转载 作者:行者123 更新时间:2023-12-02 07:11:03 26 4
gpt4 key购买 nike

这个问题的灵感来自于我试图回答 this one .

假设您有一系列数据(例如可能来自 CSV 文件)。 groupBy 可用于分析数据的某些方面,按列或列组合进行分组。例如:

val groups0: Map[String, Array[String]] = 
seq.groupBy(row => row(0) + "-" + row(4))

如果我想在我可以做的组内创建子组

val groups1: Map[String, Map[String, Array[String]]] = 
groups0.mapValues(row => row.groupBy(_(1))

如果我想多做一次,那就太麻烦了:

val groups2 = 
groups1.mapValues(groups => groups.mapValues(row => row.groupBy(_(2)))

所以这里是我的问题,给定一个 Map[K0, Map[K1, ..., Map[Kn, V]]] 的任意嵌套,你如何写一个 mapValues 函数接受一个 f: (V) => B 并应用到最里面的 V 以返回一个 Map[K0, Map[K1, ..., Map[Kn, B]]]?

最佳答案

我的第一直觉告诉我,以类型安全的方式处理任意嵌套是不可能的,但如果您定义一些隐式告诉编译器如何处理,似乎是可能的。
本质上,“简单”映射器告诉它如何处理普通的非嵌套情况,而“wrappedMapper”告诉它如何向下钻取一个 Map 层:

  // trait to tell us how to map inside of a container.
trait CanMapInner[WrappedV, WrappedB,V,B] {
def mapInner(in: WrappedV, f: V => B): WrappedB
}

// simple base case (no nesting involved).
implicit def getSimpleMapper[V,B] = new CanMapInner[V,B,V,B] {
def mapInner(in: V, f: (V) => B): B = f(in)
}

// drill down one level of "Map".
implicit def wrappedMapper[K,V,B,InnerV,InnerB]
(implicit innerMapper: CanMapInner[InnerV,InnerB,V,B]) =
new CanMapInner[Map[K,InnerV], Map[K,InnerB],V,B] {
def mapInner(in: Map[K, InnerV], f: (V) => B): Map[K, InnerB] =
in.mapValues(innerMapper.mapInner(_, f))
}

// the actual implementation.
def deepMapValues[K,V,B,WrappedV,WrappedB](map: Map[K,WrappedV], f: V => B)
(implicit mapper: CanMapInner[WrappedV,WrappedB,V,B]) = {
map.mapValues(inner => mapper.mapInner(inner, f))
}

// testing with a simple map
{
val initMap = Map(1 -> "Hello", 2 -> "Goodbye")
val newMap = deepMapValues(initMap, (s: String) => s.length)
println(newMap) // Map(1 -> 5, 2 -> 7)
}

// testing with a nested map
{
val initMap = Map(1 -> Map("Hi" -> "Hello"), 2 -> Map("Bye" -> "Goodbye"))
val newMap = deepMapValues(initMap, (s: String) => s.length)
println(newMap) // Map(1 -> Map(Hi -> 5), 2 -> Map(Bye -> 7))
}

当然,在实际代码中,模式匹配动态解决方案因其简单性而极具吸引力。类型安全不是一切:)

关于scala - 嵌套 map 最内层 map 上的 mapValues,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5846208/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com