gpt4 book ai didi

perl - 在 Scala 中创建和积累 Map of Map ... 的 Map

转载 作者:行者123 更新时间:2023-12-04 18:35:56 24 4
gpt4 key购买 nike

我有一个文件,其中包含有关 Salesman、Product、Location、SalesValue 的数据

例如:

Bob, Carrots, United States, 200
Bill, Potatoes, England, 100
Bob, Oranges, England, 50
Bob, Carrots, United States, 20

可以使用以下代码将 SalesValue 简洁地累积为 perl 中 hash of hash 的 hash
while(<>){
@cols = split(/,/);
$vals {$cols[0]} {$cols[1]} {$cols[2]} += $cols[3];
}

有没有人有任何建议如何最好地在scala中实现 map map 的创建以及积累?

最佳答案

我建议将这些 map 的合并视为 monoid-append手术。

首先,我们将 map 的 map 创建为单个元素:

val input = """Bob, Carrots, United States, 200
|Bill, Potatoes, England, 100
|Bob, Oranges, England, 50
|Bob, Carrots, United States, 20""".stripMargin.lines.toList

val mmm = input.map(_.split(", "))
.map { case Array(n, g, c, v) => Map(n -> Map(g -> Map(c -> v.toInt))) }
mmm类型为 List[Map[String, Map[String, Map[String, Int]]]] :
    List[Map[String, 
Map[String,
Map[String, Int]]]]

那么我们可以 suml使用像 scalaz 这样的库或 cats :
import scalaz._, Scalaz._

println(mmm.suml)

这将打印(未识别):
Map(Bill -> Map(Potatoes -> Map(England -> 100)), 
Bob -> Map(Oranges -> Map(England -> 50),
Carrots -> Map(United States -> 220)))

帮助了解 .suml 背后发生的事情操作我会 无耻建议查看我去年做的这个演示文稿 https://speakerdeck.com/filippovitale/will-it-blend-scalasyd-february-2015

编辑

我们也可以看到我们的 map map 为 Foldable并使用 foldMap对于相同的结果:
input.map(_.split(", "))
.foldMap{ case Array(n, g, c, v) => Map(n -> Map(g -> Map(c -> v.toInt))) }

关于perl - 在 Scala 中创建和积累 Map of Map ... 的 Map,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34806396/

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