我在下面有一个List集合:
PO_ID | Product_ID |名称|数量
PO123 | P001 |第1项| 10
PO123 | P001 |第1项| 10
PO123 | P002 |第2项| 30
PO123 | P002 |第2项| 10
如何将其转换为下面的集合:
PO_ID | Product_ID |名称|数量
PO123 | P001 |第1项| 20
PO123 | P002 |第2项| 40
感谢您的帮助
答案 0 :(得分:2)
我真的不明白你的“地图”是如何定义的,它对我来说看起来更像是一个列表。
以下是如何使用List执行此操作,如果您想使用Map执行此操作,则只需稍微调整一下代码,因为下面使用的函数都是从可迭代基类继承的(对于map来说是常见的)和列表)。
val data = List(("PO123", "P001", "Item 1", 10),
("PO123", "P001", "Item 1", 10),
("PO123", "P002", "Item 2", 30),
("PO123", "P002", "Item 2", 10))
data.groupBy( product => (product._1, product._2, product._3))
.map {
case (productInfo, products) => {
val total = products.foldLeft(0)((sum,elt) => sum + elt._4)
(productInfo._1,productInfo._2,productInfo._3,total)
}
}
结果如下:
scala.collection.immutable.Iterable[(String, String, String, Int)] =
List((PO123,P001,Item 1,20), (PO123,P002,Item 2,40))
答案 1 :(得分:2)
有点像
那样好case class Document(poID: String, productID: String, name: String, qty: Int)
然后你可以
var list2 = list.groupBy(doc => doc.productID)
为您提供Map [String,List [Document]]。现在你可以用它来映射:
list2.map(stringListTuple => stringListTuple._2.foldLeft(Document("","","",0)){
(acc: Document,curr: Document) => Document(curr.poID, curr.productID, curr.name,curr.qty + acc.qty)
}).toList.sortBy(el => el.productID)
它有效,但我相信你可以做得更漂亮:)
答案 2 :(得分:0)
让
val in = Array(("PO123", "P001", "Item 1", 10), ("PO123", "P001", "Item 1", 10),
("PO123", "P002", "Item 2", 30), ("PO123", "P002", "Item 2", 10))
然后
in groupBy (p=>(p._1,p._2,p._3)) map { case(k,v) =>
(k._1, k._2, k._3, (v map (_._4) sum )) }
返回
List((PO123,P001,Item 1,20), (PO123,P002,Item 2,40))
请注意,v map (_._4)
会将数量提取到列表中,以便我们可以在不折叠的情况下对它们进行求和。