【问题标题】:Scala - Mapping one key to multiple values of different typeScala - 将一个键映射到不同类型的多个值
【发布时间】:2018-02-28 18:31:55
【问题描述】:

所以我正在尝试在 Scala 中处理数据。我现在遇到了障碍。我正在将一个文本文件读入包含列表的程序中,创建一个案例类来读取每个标题。我已经设法将(String,String)映射到double,但我希望将字符串映射到(string,double)。相关代码在这里:

def averageofactions (): Map[(String,String),  Double] = {

  datafile.groupBy(d => (d.user, d.typeofaction))
.mapValues(averageof => averageof.map(_.amount).sum /averageof.length)
 }

这给了我我想要的东西(特定用户的特定操作的平均数量),但格式化后它给出了(用户 ID、操作)-> 平均,而我只想要一个类似的列表

用户 ID1:

Action1 -> 平均

Action2 -> 平均

等等。我知道最好的方法可能是通过更改它来返回 Map[String, (String,Double)],或者可能是多图/哈希图,但我不确定如何去做。我试过了:

def modifiedaverage (): Map[String, (List[String], Double)] = {

  datafile.groupBy(d => (d.user))
.mapValues(averageof => (averageof.map(_.typeofaction),     averageof.map(_.amount).sum/averageof.length))

}

但是这里的输出完全奇怪。我怎样才能重写这个函数来给我想要的东西?

【问题讨论】:

  • 看起来您希望它返回 Map[String, Map[String, Double]],而不是 Map[String, (List[String], Double)],因为每个“动作”都有自己的“价值”——对吧?

标签: scala


【解决方案1】:

如果您希望输出类型为Map[String, Map[String, Double]](地图的地图),您可以对user 分组的每个结果按actionoftype 分组:

def averageofactions(): Map[String, Map[String, Double]] = {
  datafile.groupBy(_.user)
    .mapValues(_.groupBy(_.typeofaction)
      .mapValues(averageof => averageof.map(_.amount).sum /averageof.length))
}

或者,如果您想将其“展平”为(String, String, Double) 元组的序列(而不是映射),您可以:

def averageofactions(): Seq[(String, String, Double)] = {
  datafile.groupBy(averageof => (averageof.user, averageof.typeofaction))
    .mapValues(averageof => averageof.map(_.amount).sum /averageof.length)
    .map { case ((user, action), avg) => (user, action, avg) }.toSeq
}

【讨论】:

  • 啊,我明白了!现在这很有意义。谢谢!
猜你喜欢
  • 1970-01-01
  • 2021-09-11
  • 2014-04-16
  • 1970-01-01
  • 1970-01-01
  • 2021-12-22
  • 2017-10-27
  • 2019-09-08
  • 2020-12-14
相关资源
最近更新 更多