我有以下列表集合:斯卡拉計算相同產品的總量
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
謝謝您的幫助
我有以下列表集合:斯卡拉計算相同產品的總量
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
謝謝您的幫助
我真的不明白怎麼你的「地圖」的定義,它肯定看起來更像是一個名單給我。
這裏是你如何使用List來完成它,如果你想用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))
這將是不錯的某事像
case class Document(poID: String, productID: String, name: String, qty: Int)
,那麼你可以
var list2 = list.groupBy(doc => doc.productID)
,讓你地圖[字符串,列表[文檔]]。現在你可以用它映射:
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)
它的工作原理,但我相信你能做到這一點更漂亮:)
讓
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)
將數量提取到列表中,以便我們可以將它們相加而不折疊。
謝謝,出色的解決方案,它的工作原理! –