2017-10-09 85 views
1

我正在開發一個單詞應用程序。 我的問題類似於這個問題:this在字符串數組中搜索多個單詞(或字符)(swift)

但是,我想要在字符串數組中進行搜索。

let myArr: [String] = ["BERLIN","ISTANBUL","TOKYO","NEWYORK","PRAGUE","WIEN"] 
    let findChrs = ["I","N"] 

    // myArr.contains(findChrs) //so error 

我想:返回或 「BERL IN」, 「 STA ñ BUL」 和 「W Ëñ」(包含 「我」 和「N」)

我試過,但它太長了......(我看個別太多的話):

for i in 0...myArr.count - 1 { 

     let success = !findChrs.contains(where: { !myArr[i].contains($0) }) 
     if success { 
      print(myArr[i]) 
     } 

    } 

有沒有更簡單的方法?非常感謝。

回答

2

有解決你的問題

我開始使用硬編碼搜索條件

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時,我想在代碼中,第二塊的更容易瞭解aStringbString發生了什麼。

請檢查遊樂場中的代碼,看看這段代碼是如何工作的。如果你還沒有使用高階函數,理解沒有遊樂場和打印語句的過濾器會有點令人生畏。

更新:

只是在想這個問題,我給了這種替代方法一試,使用套,地圖和過濾器。這是超級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仍然是一個更好的選擇,可能更容易理解。

希望這可以幫助任何人閱讀答案理解過濾器和地圖!

+0

謝謝。非常清楚和有用。 @Nitin Alabur – MhmKK

1

你也可以使用過濾器一組只要你不是在尋找包含重複字母的圖案:

let myArr: [String] = ["BERLIN","ISTANBUL","TOKYO","NEWYORK","PRAGUE","WIEN"] 
let findChrs = Set<Character>(["I","N"]) // let findChrs = Set("IN") 

let matchingCities = myArr.filter{ findChrs.isSubset(of:$0) } 
+1

謝謝。我試過你的代碼。當您在搜索時需要使用多個字母或單詞時,它不起作用。非常高效,而只處理字符。 @Alain T. – MhmKK