如何根据scala中的值对列表进行分组?

时间:2016-02-29 18:20:24

标签: java scala

如何在scala列表中使用group by? 我是初学者在我的代码中获取一些记录列表,我想在列表中使用group by。这是我的列表示例

 List((smith,swarm_4,group_2,400,1200), (smith,swarm_5,group_2,400,1200),
     (Michel,swarm_4,group_2,400,400), (smith,swarm_6,group_3,400,1200),    
     (smith,swarm_7,group_3,400,1200), (Michel,swarm_4,group_2,300,200), 
     (Michel,swarm_5,group_2,400,400), (Michel,swarm_6,group_3,400,400), 
     (Michel,swarm_7,group_3,400,400), (smith,swarm_5,group_2,100,200)
 )

假设列表包含此格式的记录(名称:String,swarm:String,group:String,Tx:Long,Rx:Long)。 我想分组(群组和群组),群组匹配然后聚合(Tx + Tx)和(Rx + Rx)。

例如:

 (smith,swarm_5,group_2,400,1200) and (smith,swarm_5,group_2,100,200) ==>
((swarm_5,group_2) => (400+100, 1200+200) => output(smith,swarm_5,group_2,500,1400)) 

使输出变得像

  List((smith,swarm_4,group_2,400,1200), (smith,swarm_5,group_2,500,1400),
       (Michel,swarm_4,group_2,700,600), (smith,swarm_6,group_3,400,1200), 
       (smith,swarm_7,group_3,400,1200), (Michel,swarm_5,group_2,400,400), 
       (Michel,swarm_6,group_3,400,400), (Michel,swarm_7,group_3,400,400))

请建议我在scala编码中使用group by或任何其他想法。

1 个答案:

答案 0 :(得分:1)

此代码适用于您的指定列表

var outList = inList.map( x =>  ((x._1,x._2,x._3),x._4,x._5)))
         .groupBy(_._1)
         .map{case (key,value) => 
                 value.reduce( (x,y) => (x._1,(x._2._1+y._2._1,x._2._2+y._2._2) ) )};