[英]How to get the sum of two elements in a list of Arrays in Scala
您好,並提前感謝您花時間閱讀本文。
我正在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)
它返回一個單位,我無法用它做任何事情。
如果你能解釋一下,我將不勝感激。
我在下面的鏈接中找到了類似的東西,但是在兩個獨立的數組之間,這似乎更簡單。
謝謝,
萌
它肯定不會“歸還一個單位”。 res
是一系列雙打。 你忘記了這個名字,但這很容易解決:
val res = datArray.map(x => x(1) -> x(4).toInt * x(5).toDouble)
現在,你有一系列元組, Seq[(String, Double)]
,其中第一個元素是名稱,第二個元素是你所追求的產品。
您可以使用此列表執行各種操作:
name
- > score
: res.toMap
(注意:如果您有相同名稱的重復條目,則只保留每組中的最后一個) val (name, score) = res.minBy(_._2)
的條目: val (name, score) = res.minBy(_._2)
res.map(_._2).sum
res.sortBy(-_._2).take(10)
res.groupBy(_._1).mapValues(_.map(_._2).sum)
val res = datArray.map(x => (x(1), x(4).toInt * x(5).toDouble)).toMap
你幾乎就在那里,你返回了一個包含值的列表。 您應該將其轉換為對(通過添加鍵)。 一對看起來像(key, value)
,然后調用toMap。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.