要从我使用的字符串列表中删除字符:
val validLines : List[String] = List("test[" , "test]")
val charsToClean: List[String] = List("\"", "[", "]", "'")
val filtered = validLines.map(line => line.replace(charsToClean(0), "")
.replace(charsToClean(1), "")
.replace(charsToClean(2), "")
.replace(charsToClean(3), ""))
我正在尝试使用内部地图功能,而不是硬编码字符的位置来替换:
val filtered1 : List[String] = validLines.map(line => charsToClean.map {c => line.replace(c , "") })
但收到编译错误:
mismatch; found : List[List[String]] required: List[String]
是否应该返回line.replace(c , "")
的结果?
答案 0 :(得分:6)
不,因为您的代码更像是:对于每个字符串和每个不需要的字符,请为此符号返回替换(n ^ 2个字符串)。
使用以下代码段可以实现您可能想要做的事情:
val rawLines : List[String] = List("test[" , "test]")
val blacklist: Set[Char] = Set('\"', '[', ']' ,''')
rawLines.map(line => line.filterNot(c => blacklist.contains(c)))
// res2: List[String] = List(test, test)
或者,使用正则表达式,正如@ ka4eli在他的回答中所示。
答案 1 :(得分:3)
replaceAll
可以包含使用|
(或)运算符构造的更复杂的正则表达式:
validLines.map(_.replaceAll("\\[|\\]|'|\"", ""))
答案 2 :(得分:3)
您需要使用foldLeft
代替map
。
val validLines : List[String] = List("test[" , "test]")
val charsToClean: List[String] = List("\"", "[", "]", "'")
val filtered : List[String] = validLines.map(line => charsToClean.foldLeft(line)(_.replace(_, "")))
答案 3 :(得分:1)
虽然使用了for comprehension语法,但相当于@ om-nom-nom;给出一组要擦除的字符,
val charsToClean = """"[]'""".toSet
然后
for (l <- validLines) yield l.filterNot(charsToClean)
其中隐式集合包含Char => Boolean
功能应用于filterNot
。