2015-08-09 7 views
2

Чтобы удалить символы из списка строк я использую:Удаление символов из списка строк

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 , "") не возвращаются?

ответ

5

Нет, потому что ваш код больше похож: для каждой строки и для каждого нежелательного символа возвращает для этого самого символа (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 показал в своем ответе

+0

спасибо, если я использую List [String] вместо Set [Char], чтобы содержать элементы черного списка, элементы не фильтруются? –

+1

@ blue-sky, вы можете использовать 'List [Char]', но не 'List [String]' – ka4eli

+0

@ ka4eli Почему? содержит метод должен вести себя одинаково, будь то список строк или набор символов? –

3

replaceAll может содержать более сложные регулярные выражения, построенный с | (или) оператор:

validLines.map(_.replaceAll("\\[|\\]|'|\"", "")) 
2

Вы должны использовать 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(_, ""))) 
1

Эквивалент @ om-nom-nom, хотя используется синтаксис для понимания; задано множество символов, чтобы стереть,

val charsToClean = """"[]'""".toSet 

затем

for (l <- validLines) yield l.filterNot(charsToClean) 

, где неявное набор включение Char => Boolean функция применяется в filterNot.

Смежные вопросы