加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

perl – 在scala中创建和累积Map的Map Map

发布时间:2020-12-16 06:26:42 所属栏目:大数据 来源:网络整理
导读:我有一个包含Salesman,Product,Location,SalesValue数据的文件 例如: Bob,Carrots,United States,200Bill,Potatoes,England,100Bob,Oranges,50Bob,20 可以使用以下代码将SalesValue简洁地累积到perl中的哈希哈希值中 while(){ @cols = split(/,/); $vals {$
我有一个包含Salesman,Product,Location,SalesValue数据的文件

例如:

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

可以使用以下代码将SalesValue简洁地累积到perl中的哈希哈希值中

while(<>){
    @cols = split(/,/);
    $vals {$cols[0]} {$cols[1]} {$cols[2]} += $cols[3];
}

有没有人有任何建议如何创建地图地图的地图,加上积累,最好在scala中实现?

解决方法

我建议将这些地图合并为一个monoid-append操作.

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

val input = """Bob,200
              |Bill,100
              |Bob,50
              |Bob,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,Int]]]]:

List[Map[String,Map[String,Int]]]]

然后我们可以使用像scalaz或cat这样的库来汇总:

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

编辑

我们还可以看到我们的地图地图地图可折叠,并使用foldMap获得相同的结果:

input.map(_.split(","))
     .foldMap{ case Array(n,v) => Map(n -> Map(g -> Map(c -> v.toInt))) }

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读