如何在Scala中的数组列表中获取两个元素的总和

时间:2017-06-15 14:39:44

标签: arrays scala collections sum

您好,并提前感谢您花时间阅读本文。

我正在Scala中编写一段代码来读取数据文件,并生成几个聚合。为简单起见,我们假设内容类似于以下内容(记录以制表符分隔):

  

01/12/2015 JACK M 21XYZ 56 200

     

01/14/2015 JOHN M 22ABS 34 145

我想将最后两个数字相乘并将它们与第二个项目(名称)一起存储,然后运行一些统计数据(min, max, top 10, etc.)

到目前为止我采取的步骤:

1-阅读文件

    val dat = scala.io.Source.fromFile("abs.txt")

2-将内容放入列表

    val datList = try dat.getLines.toList finally dat.close

3-将每个字符串拆分为字符串数组

    val datArray = datList.map(_.split('\t'))

在这些步骤之后,我有一个数组字符串数组。我被困在这一点上。我不知道如何计算每个数组的最后两个元素的乘法并将结果存储在地图中并将名称作为键。

当我尝试类似

    val res = datArray.map(x => x(4).toInt * x(5).toDouble)

它返回一个单位,我无法用它做任何事情。

如果你能说清楚,我将不胜感激。

我在下面的链接中找到了类似的东西,但是在两个独立的数组之间似乎更简单。

Element-wise sum of arrays in Scala

谢谢,

2 个答案:

答案 0 :(得分:1)

它肯定没有"返回一个单位"。 res是一系列双打。 你忘记了这个名字,但这很容易解决:

 val res = datArray.map(x => x(1) -> x(4).toInt * x(5).toDouble)

现在,您有一系列元组Seq[(String, Double)],其中第一个元素是名称,第二个元素是您追求的产品。

您可以使用此列表执行各种操作:

  • 将其转换为地图name - > scoreres.toMap(请注意:如果您有相同名称的重复条目,则只保留每组中的最后一个)
  • 找到得分最低的条目:val (name, score) = res.minBy(_._2)
  • 查找得分最高的条目:`val(name,score)= res.maxBy(_._ 2)
  • 查找所有分数的总和:res.map(_._2).sum
  • 查找前十个条目:res.sortBy(-_._2).take(10)
  • 将相同名称的分数合并,并制作与第一项相似的地图,但每个名称的总分数为res.groupBy(_._1).mapValues(_.map(_._2).sum)
  • 等...

答案 1 :(得分:0)

val res = datArray.map(x => (x(1), x(4).toInt * x(5).toDouble)).toMap

你几乎就在那里,你返回了一个包含值的列表。您应该将其转换为对(通过添加键)。一对看起来像(key, value),然后调用toMap。