2016-08-10 2 views
0

Это похоже на то, что это должно быть очень просто, но после нескольких вариантов я не могу вернуть правильный результат.Scala фильтрация на 2 условия для удаления строк из списка

У меня есть список строк, которые я пытаюсь фильтровать, и набор строк, которые я использую в качестве черного списка. Если какая-либо из строк в моем списке находится в черном списке, я хочу игнорировать их и возвращать только те, которые не присутствуют. В дополнение к этому у меня есть другой случай, который мне нужно проверить, поэтому мне нужно убедиться, что его нет в черном списке, а также не состояние два.

val strings = List("something", "something.else", "something-else") 
val blacklist = Set(".else", ".new", ".old") 

Я пытаюсь сделать что-то вроде:

strings.filter(f => !f.endsWith("-else")) 

оставить только «что-то» и «something.else», но я не могу показаться, чтобы вернуть «что-то» само по себе.

+0

Вы хотите слово не быть в «черном списке» или просто в конце? – Esardes

+0

@ Esardes, это расширение имени файла, поэтому jsut the end – null

+4

'strings.filterNot (s => blacklist.exists (s.endWith))'? –

ответ

1

Я понимаю, что вы хотите удалить элемент, если он заканчивается чем-то, что находится в вашем черном списке. Вы можете попробовать что-то вроде

strings.filter {x => (blacklist map {word => !(x endsWith word)} reduce((a,b) => a && b)) } 

с другим условием, например x.length >= 2

strings.filter {x => (blacklist map {word => !(x endsWith word)} reduce((a,b) => a && b)) && x.length >= 2} 
+0

thankyou, с чем справиться помощь? – null

+1

проверяет, что мы имеем только значение «true» в наборе, который мы строим прямо перед этим. Более короткая версия - использовать метод удобства «существует», который использует Тзач Зоар в своем ответе, и что я забыл, но таким образом вы можете увидеть инструмент позади. – Esardes

+0

спасибо - ваше время и помощь очень ценятся - мои попытки не повторялись «endswith», увидев решения, я думаю, что это, вероятно, более эффективно, если я добавлю «-else» в черный список и просто проверим одно условие – null

2
strings.filter(
    f => !f.endsWith("-else") && !blacklist.exists(suffix => f.endsWith(suffix)) 
) 

Или более короткий (но идентичную) версия:

strings.filter(f => !f.endsWith("-else") && !blacklist.exists(f.endsWith)) 
Смежные вопросы