首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Scala计算相同产品的总数量

Scala计算相同产品的总数量
EN

Stack Overflow用户
提问于 2014-04-07 05:32:44
回答 2查看 186关注 0票数 0

我有一个清单收集如下:

PO_ID _ Product_ID _

PO123 - P001 -项目1- 10

PO123 - P001 -项目1- 10

PO123 - P002 -项目2-2- 30

PO123 - P002 -项目2- 10

如何将其转换为如下集合:

PO_ID _ Product_ID _

PO123 - P001 -项目1- 20

PO123 - P002 -项目2-4

谢谢你的帮助

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-04-07 06:12:56

我真的不明白你的“地图”是如何定义的,在我看来,它更像是一个列表。

下面是如何使用列表来实现的方法,如果您想使用Map来完成它,您只需稍微修改代码,因为下面使用的函数都是从可迭代基类继承的(常见于映射和列表)。

代码语言:javascript
复制
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)
          }
 }

其结果将是:

代码语言:javascript
复制
scala.collection.immutable.Iterable[(String, String, String, Int)] =
    List((PO123,P001,Item 1,20), (PO123,P002,Item 2,40))
票数 2
EN

Stack Overflow用户

发布于 2014-04-07 06:42:51

有这样的东西会很好

代码语言:javascript
复制
case class Document(poID: String, productID: String, name: String, qty: Int)

那你就可以

代码语言:javascript
复制
var list2 = list.groupBy(doc => doc.productID)

这给了Map[String,ListDocument]。现在您可以用以下方法来映射它:

代码语言:javascript
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22904283

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档