2017-04-15 129 views
0

我有一項任務,我在使用Scala時遇到了一些麻煩。我必須定義一個函數,它返回從收到的列表構造的字符串列表作爲參數。對於在元素中的每個字母,下一個字符將被添加:Scala:在字符串列表中的每個字符後添加字符

transformStrings(List("CHAT", "LIST", "ASK")) 
//> res13: List[String] = List(CDHIABTU, LMIJSTT, ABSTKL) 

到目前爲止,我想我必須以某種方式映射列表,然後使用的foreach或用於/產量通過每一個字符來運行,但我不確定如何完全做到這一點。

+0

'z'或'Z'後面是什麼?通過ASCII值,它應該分別是「{」和「[」。你需要它來環繞嗎? – jwvh

回答

2

你可以這樣做:

List("CHAT", "LIST", "ASK").map(s => s.flatMap(c => c.toString + (c+1).toChar)) 
// res9: List[String] = List(CDHIABTU, LMIJSTTU, ABSTKL) 

或者:

List("CHAT", "LIST", "ASK").map(s => s.flatMap(c => Seq(c, (c+1).toChar))) 
// res13: List[String] = List(CDHIABTU, LMIJSTTU, ABSTKL) 
+0

這工作完美,謝謝! – Edhelvar

3

如何foldLeft,如:

List("CHAT", "LIST", "ASK").map(_.foldLeft("")((a, b) => a + b + (b + 1).toChar)) 
>res0: List[String] = List(CDHIABTU, LMIJSTTU, ABSTKL) 

釋:

  1. a減少值
  2. b下一個字符String(如 「聊天」)
  3. (b+1)裝置到next charASCII數字
  4. toChar將轉換ascii numberChar
  5. 最後joinbnext charString
+0

你可以向Scala新手解釋'(b + 1)'部分是做什麼的嗎?這是字符增量發生的地方嗎?如果是這樣,這不是一個非常奇怪的結構嗎?謝謝! – patrick

+1

@patrick每個字符都由一個數字表示,因爲它是一個ASCII值 - 例如,在Scala REPL中,嘗試輸入'('C'.toInt + 1).toChar',你會看到你得到了'D' ,它有一個整數表示,比「C」的值大1。 – Eric

+0

哇,那是狂野的,謝謝!我查看了它(http://www.scala-lang.org/api/2.12.x/​​scala/collection/immutable/StringOps.html),並想知道這是否適用於所有的Unicode字符?我覺得它不能爲這些返回一個Int? (不適用於我,但可能是我的終端設置) – patrick

相關問題