Arrays 在字符串数组(swift)中搜索多个单词(或字符)

Arrays 在字符串数组(swift)中搜索多个单词(或字符),arrays,swift,string,Arrays,Swift,String,我正在开发一个Word应用程序。 我的问题类似于这个问题: 但是,我想在字符串数组中进行搜索 let myArr: [String] = ["BERLIN","ISTANBUL","TOKYO","NEWYORK","PRAGUE","WIEN"] let findChrs = ["I","N"] // myArr.contains(findChrs) //so error 我想:返回3或“BERLIN”、“ISTANBUL”和“WIEN”(包含“I”和“N”) 我试过了,但

我正在开发一个Word应用程序。 我的问题类似于这个问题:

但是,我想在字符串数组中进行搜索

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

   // myArr.contains(findChrs)  //so error
我想:返回3或“BERLIN”、“ISTANBUL”和“WIEN”(包含“I”和“N”)

我试过了,但是太长了…(我一个人看,字太多了。):


有没有更简单的方法?非常感谢。

有一种快速的方法可以解决您的问题

首先,我在myArr数组上使用一个过滤器,使用硬编码的搜索词

let filteredStrings : [String] = myArr.filter({
        return $0.contains("I") && $0.contains("N")
    })
但只有当你的搜索结果总是只有I和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)
我认为,在第二段代码中,使用
aString
bString
更容易理解,而不是使用$0

一定要在操场上检查代码,看看这个代码是如何工作的。如果您没有使用高阶函数,那么在没有操场和print语句的情况下理解过滤器可能会有点令人生畏

更新:

我正在考虑这个问题,我尝试了另一种方法,使用集合、映射和过滤器。它速度非常快,可能很难阅读/理解:

答案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
}
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似乎比答案2快约3倍。因此,答案1仍然是一个更好的选择,可能更容易理解


希望这有助于阅读答案的人理解过滤器和地图

有一种快速解决问题的方法

首先,我在myArr数组上使用一个过滤器,使用硬编码的搜索词

let filteredStrings : [String] = myArr.filter({
        return $0.contains("I") && $0.contains("N")
    })
但只有当你的搜索结果总是只有I和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)
我认为,在第二段代码中,使用
aString
bString
更容易理解,而不是使用$0

一定要在操场上检查代码,看看这个代码是如何工作的。如果您没有使用高阶函数,那么在没有操场和print语句的情况下理解过滤器可能会有点令人生畏

更新:

我正在考虑这个问题,我尝试了另一种方法,使用集合、映射和过滤器。它速度非常快,可能很难阅读/理解:

答案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
}
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似乎比答案2快约3倍。因此,答案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) }
let myArr:[String]=[“柏林”、“伊斯坦布尔”、“东京”、“纽约”、“布拉格”、“维也纳”]
let findChrs=Set([“I”,“N”])//let findChrs=Set(“IN”)
让matchingCities=myArr.filter{findChrs.isSubset(of:$0)}

如果不查找包含重复字母的图案,也可以使用过滤器集:

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) }
let myArr:[String]=[“柏林”、“伊斯坦布尔”、“东京”、“纽约”、“布拉格”、“维也纳”]
let findChrs=Set([“I”,“N”])//let findChrs=Set(“IN”)
让matchingCities=myArr.filter{findChrs.isSubset(of:$0)}

谢谢。我试过你的密码。当您在搜索时需要使用多个字母或单词时,它不起作用。仅处理字符时非常高效@阿兰T.很好!我们如何引入不区分大小写的过滤器,例如:let findChrs=Set(“NenYk”),以便找到纽约?谢谢。我试过你的密码。当您在搜索时需要使用多个字母或单词时,它不起作用。仅处理字符时非常高效@阿兰T.很好!我们如何引入不区分大小写的过滤器,例如:let findChrs=Set(“NenYk”),以便找到纽约?