有解決你的問題
我開始使用硬編碼搜索條件
let filteredStrings : [String] = myArr.filter({
return $0.contains("I") && $0.contains("N")
})
使用myArr,該陣列上只是一個過濾器swifty的方式,但多數民衆贊成去只有幫助,如果您findChars總是會只能是我和N.
後來才知道如何做到這一點沒有硬編碼查找字符的字符:
回答1
let myArr: [String] = ["BERLIN","ISTANBUL","TOKYO","NEWYORK","PRAGUE","WIEN"]
let findChrs = ["I","N"]
let filteredStrings : [String] = myArr.filter({ (aString) in
let hasChars = findChrs.filter({(bString) in
return aString.contains(bString)
})
print(hasChars)
return hasChars.count == findChrs.count
})
print(filteredStrings)
而不是使用$ 0時,我想在代碼中,第二塊的更容易瞭解aString
和bString
發生了什麼。
請檢查遊樂場中的代碼,看看這段代碼是如何工作的。如果你還沒有使用高階函數,理解沒有遊樂場和打印語句的過濾器會有點令人生畏。
更新:
只是在想這個問題,我給了這種替代方法一試,使用套,地圖和過濾器。這是超級SWIFTY,並且可能難以閱讀/理解:
答案2,簡潔
let myArr: [String] = ["BERLIN","ISTANBUL","TOKYO","NEWYORK","PRAGUE","WIEN"]
let findChrs = ["I","N"]
let finderSet:Set<String> = Set(findChrs)
let filteredArray = myArr.filter {
return Set($0.characters.map({String($0)})).intersection(finderSet).count == findChrs.count
}
出於可讀性和易於理解的緣故,這裏發生了什麼:
答案2,詳細
let filteredArray = myArr.filter { (aString) -> Bool in
//for each string in myArr, convert it into an array of string chars
let stringArray = aString.characters.map({aCharacter in
String(aCharacter)
})
//convert string array into a set
let aSet = Set(stringArray)
// find the intersection (common elemnts from aSet and finderSet)
let intersect = aSet.intersection(finderSet)
//return true if aString has all of findChrs elements
return intersect.count == findChrs.count
}
兩個答案2'簡潔'和'詳細'會給你相同的結果。
基於一些簡單的代碼執行時間檢查,它看起來像回答1是〜3倍的速度比答案2。所以,答案1仍然是一個更好的選擇,可能更容易理解。
希望這可以幫助任何人閱讀答案理解過濾器和地圖!
謝謝。非常清楚和有用。 @Nitin Alabur – MhmKK