簡體   English   中英

添加scala列表的元素

[英]add elements of scala list

輸入中有以下列表:

val listin= List("banana 20 20", "apple 50 20", "berry 10 10")

我想對列表中line的第二和第三元素求和,因此輸出應如下所示:

val lisout=("banana 20 20 40", "apple 50 20 70", "berry 10 10 20")

我寫了下面的代碼

 def addInt(a:Int,b:Int):Int={
   a+b
 }

val listout= listin.map(_.split("\\s+")).collect{
  case e=> (e + " " + (addInt(e(1).toInt, e(2).toInt)).toString)}

但是我得到以下輸出/錯誤:

List[String] = List([Ljava.lang.String;@7680c376 40, 
[Ljava.lang.String;@bf64054 70, [Ljava.lang.String;@4da833d 20)

請以任何優雅的方式致以誠摯的問候

字符串的分割是Array[String] ,因此collecte也是Array[String] 如果用另一個String調用+ ,Scala將調用數組的toString ,這是一個丑陋的表示。

一個最優雅的方法是將模式匹配與split函數配合使用。

listin.map { str =>
    val Array(_, numA, numB) = str.split("\\s+")
    str + " " + addInt(numA.toInt, numB.toInt)
}

一旦map(_.split(...)) ,就獲得了一個數組列表,因此e將數組與split產生的字符串匹配。 如您所見,此數組的字符串表示形式非常難看。 嘗試這樣的事情:

listin.map { str =>
  val components = str.split("\\s+")
  str + " " + (components(1).toInt + components(2).toInt)
}

另外,您可以使用正則表達式來匹配整個字符串,而不是使用split 這里:

val P = """\w+\s+(\d+)\s+(\d+)""".r
listin.map { case s @ P(x, y) => s + " " + (x.toInt + y.toInt) }

給出相同的結果:

List(banana 20 20 40, apple 50 20 70, berry 10 10 20)

模式P意思是:標識符符號,后跟空格,后跟數字(第一個捕獲的組),再跟空格,再捕獲另一組數字。 map ,變量s匹配整個字符串, xy匹配兩個捕獲的帶數字的組。

之所以會得到輸出,是因為列表上的toString不會提取內容,而是輸出類型信息。 您可能要使用mkString函數,但這並不是Scala最令人驚奇的部分。

您需要發現部分函數的真正魔力。

val listin= List("banana 20 20", "apple 50 20", "berry 10 10")

val listout= listin.map(_.split("\\s+")).map {
  case Array(a,b,c) => s"$a $b $c ${b.toInt + c.toInt}"
}

像元組和案例類一樣,能夠取消應用序列的內容是現代語言中的一個強大概念。

我還省略了addInt函數,並給出了交換中的字符串插值示例。 您會看到,通過在插值中使用花括號,您可以注入任意代碼塊,從而使許多字符串操作變得簡潔。

最后,在這種情況下,map和collect可以互換使用,因為部分函數確實定義了整個函數,而當您想跳過與所有情況都不匹配的內容時,collect非常有用。 如果您想查看地圖失敗,只需在輸入列表中輸入“ egg 10”,而collect會跳過它。

您已經有了很好的答案。 我只想提供僅使用映射和字符串插值的簡單答案

listin.map(x => s"$x ${(x.split("\\s+")(1).toInt + x.split("\\s+")(2).toInt)}")

您試圖將字符串添加到數組對象,以便在列表中看到OBJECT_HASHCODE SUM

為了獲得所需的輸出,您必須將字符串添加到字符串,即將數組轉換為字符串,然后再添加總和。 使用collect

listInput.map(_.split("\\s+")).collect{
  case e => e.mkString(" ")+" "+(e.apply(1).toInt+e.apply(2).toInt)
}    
//res3: List[String] = List(banana 20 20 40, apple 50 20 70, berry 10 10 20)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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