【问题标题】:Perform arithmetic on a list in Scala在 Scala 中对列表执行算术运算
【发布时间】:2018-11-04 04:30:29
【问题描述】:

我是 Scala 的新手,所以如果我在这里监督一些非常基本的东西,请原谅我。我有以下内容:

case class Record(
ID: String,
Count: Double)

List(Record("ID1",10.0),Record("ID1",60.0),Record("ID2",50.0),Record("ID3",100.0),Record("ID3",20.0),Record("ID3",10.0))

其中 x 是 ID,y 是 Record(x,y) 中的计数。我可以使用 println(records) 将此列表打印到控制台。

我正在尝试输出以下内容:

ID1,70.0
ID2,50.0
ID3,130.0

这是每个 ID 组计数的总和。我想尝试 groupBy 方法,但我很难解析列表中每​​个记录的 ID,以便开始对计数进行分组。

例如,我考虑过:

val grouped = records.groupBy(<some_logic_here>) 

但问题是列表中的对象有 Record(x,y) 环绕它。

感谢您的帮助。

【问题讨论】:

    标签: scala list


    【解决方案1】:
    case class Record(ID: String,
                        Count: Double)
    
      val records = List(Record("ID1", 10.0), Record("ID1", 60.0), Record("ID2", 50.0), Record("ID3", 100.0), Record("ID3", 20.0),
        Record("ID3", 10.0))
    

    这是一个班轮:

      val ans = records.groupBy(_.ID).mapValues(_.map(_.Count).sum)
    
      ans.foreach(x => println(s"${x._1},${x._2}"))
    

    【讨论】:

    • 谢谢,我现在明白为了选择 Record(x,y) 中的第一个字段,我只需要使用 _.ID 调用它,然后选择 Record( x,y),我需要输入 _.Count。抱歉,这是基本知识,但对我来说是新知识 - 再次感谢。
    • @Bear 你也可以使用匿名函数,比如 records.groupBy(record=> records.ID).mapValues(value=> value.map(elem=>elem.Count).sum)。谢谢
    【解决方案2】:
    case class Record(ID: String, Count: Double)
    List(Record("1", 12), Record("1", 13), Record("2", 13))
      .groupBy(_.ID)
      .map(e => Record(e._1, e._2.map(e => e.Count).sum))
    

    你需要 groupBy(ID) 然后你得到一个列表,然后你需要计算总和。

    【讨论】:

    • 输出与预期不同,您能否更新您的答案。
    猜你喜欢
    • 2013-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-06
    • 2018-01-09
    • 2012-09-12
    • 2014-10-20
    相关资源
    最近更新 更多