2016-08-10 51 views
0

這感覺就像它應該很簡單,但經過多次變化後,我無法返回正確的結果。2個條件的Scala過濾從列表中刪除字符串

我有我想要過濾的字符串列表以及我用作黑名單的一組字符串。如果列表中的任何字符串都在黑名單中,那麼我想忽略它們,只返回那些不存在的字符串。除此之外,我還有另一個需要檢查的案例,所以我需要確保它不在黑名單中,也沒有條件二。

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,這是文件擴展名,所以只是結尾 – 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

謝謝,減少幫助什麼? – null

+1

它檢查我們在我們之前建立的集合中只有值「真」。較短的版本是使用Tzach Zohar在他的回答中使用的「存在」的便利方法 - 而且我已經忘記了 - 但這樣你可以看到背後的工具。 – 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)) 
相關問題