簡體   English   中英

如何在Scala中的數組列表中獲取兩個元素的總和

[英]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)

它返回一個單位,我無法用它做任何事情。

如果你能解釋一下,我將不勝感激。

我在下面的鏈接中找到了類似的東西,但是在兩個獨立的數組之間,這似乎更簡單。

Scala中數組的元素總和

謝謝,

它肯定不會“歸還一個單位”。 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.minBy(_._2)
  • 找到得分最高的條目:`val(name,score)= res.maxBy(_._ 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM