[英]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]
,因此collect
的e
也是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
匹配整個字符串, x
和y
匹配兩個捕獲的帶數字的組。
之所以會得到輸出,是因為列表上的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.