【问题标题】:Search Array with depending order按顺序搜索数组
【发布时间】:2017-08-25 11:32:21
【问题描述】:

我有一个关于过滤数组的问题。

假设我有一组国家名称:

let countries = [Albania, Bahrain, Barbados, Denmark, France, Zimbabwe]

现在我想过滤这个数组以检查它是否包含某个字符串,比如说“ba”。 我可以很容易地做到这一点

countries = countries.filter{ $0.contains("ba")}

返回

Albania, Bahrain, Barbados, Zimbabwe

但我实际上希望字母的顺序很重要。因此,不应出现结果“Albania”和“Zimbabwe”,而只有“Bahrain”和“Barbados”,因为它们的名称以 Ba 开头。

有没有什么办法可以避免一个巨大的 for 循环遍历所有实体单独检查每个字符?

【问题讨论】:

    标签: swift


    【解决方案1】:

    使用.hasPrefix 而不是.contains,如下所示:

    print(countries.filter{ $0.hasPrefix("Ba") })
    

    请注意,这是区分大小写的。顺便说一句,在您的示例中,问题不在于缺少字母顺序,而是.contains 像 swift 中的大多数方法一样尊重大小写。

    【讨论】:

    • 太棒了! hasPrefix 正是我正在寻找的!非常感谢! :)
    【解决方案2】:

    您可以一步完成案例和过滤:

    let countries = ["Albania", "Bahrain", "Barbados", "Denmark", "France", "Zimbabwe"]
    
    let filtered = countries.filter { $0.lowercased().hasPrefix("ba") } // -> ["Bahrain", "Barbados"]
    

    这在应用过滤器的测试之前将国家名称小写,但不会更改原始数组,因此结果具有相同的大小写。

    这很重要,因为您可能错误地希望分两步执行此操作以提高可读性:

    countries
        .map { $0.lowercased()}
        .filter { $0.hasPrefix("ba")}
    

    但这会返回["bahrain", "barbados"],因为过滤器正在应用于现在小写的数组。

    【讨论】:

    • 推荐countries.filter { $0.lowercased().hasPrefix("ba") },不带map,以保持原始数组不变。
    • 这就是为什么我在答案的那部分前面加上“不正确”
    • 没错,没注意到,我的错!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-02
    • 1970-01-01
    • 1970-01-01
    • 2022-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多