2017-08-25 72 views
1

我有一个关于过滤数组的问题。搜索与依赖的顺序排列

假设我有国名的数组:

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

现在我想筛选这个数组来检查它是否包含特定字符串让说“巴”。 我可以

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

返回

Albania, Bahrain, Barbados, Zimbabwe 

但其实我是想了字母顺序无关紧要做到这一点很容易。因此,“阿尔巴尼亚”和“津巴布韦”的结果不应该出现,只有“巴林”和“巴巴多斯”作为他们的名字以巴开始。

有没有办法做到这一点,以避免一个巨大的for循环遍历所有实体检查每个字符单独?

回答

3

使用.hasPrefix代替.contains,像这样:

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

注意,这是区分大小写的。顺便说一句,在你的例子中,问题不是缺少字母顺序,而是.contains尊重大多数方法的情况。

+0

太棒了! hasPrefix正是我正在寻找的!非常感谢! :) – Paco89

0

你可以照顾的情况和过滤一步到位:

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"]

+0

为了保持原始数组的原样,我们将推荐'countries.filter {$ 0.lowercased()。hasPrefix(“ba”)}',不带'map'。 – valcanaia

+0

这就是为什么我以“错误地”为前缀的部分答案 – Abizern

+1

没错,没有注意到,我的坏! – valcanaia