2017-04-13 109 views
2

的地圖上串多個單詞我有地圖替換替換使用替代

val replacements = Map("aaa" -> "d", "bbb" -> "x", "ccc" -> "mx")

我想更換每個地圖鍵的所有出現相應值的字符串中。

val str = "This aaa is very bbb and I would love to cccc" 
val result = cleanString(str, replacements) 
result = "This d is very x and I would love to mx" 

我已經做了

val sb = new StringBuilder(str) 
for(repl <- replacements.keySet) yield { 
    sb.replaceAllLiterally(repl, replacement.get(repl)) 
} 

,但我想更多的東西的功能就像一個mapfold,我申請到字符串的函數返回另一個字符串,而無需被裏面修改一個可變變量循環。

回答

9

一個選擇:在Map使用foldLeftstr爲初始參數:

replacements.foldLeft(str)((a, b) => a.replaceAllLiterally(b._1, b._2)) 
// res8: String = This d is very x and I would love to mxc 
+0

這正是我正在尋找。 – locorecto

0

我真的不喜歡這一點,但它應該工作:

str.split(" ").toList.map { s => 
    if(replacements.get(s).isDefined) { 
    replacements(s) 
    } else { 
    s 
    } 
}.mkString(" ") 
+0

如果我提供一個沒有空格的字符串,這將不起作用。我使用的例子僅用於說明和簡單理解問題。 – locorecto

+0

我明白了。那麼你怎麼會分裂的話呢? – mfirry

+0

沒有分裂。這是一個字符串替換問題。如果提供的字符串是單個字符串,則應該替換整個字符串(如果它位於替換映射中)。 – locorecto