2017-08-25 22 views
1

配列のフィルタリングに関して質問がありました。検索順序が揃っている配列

のは、私は国の名前の配列を得たと仮定しましょう:

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

が、今私はそれが特定の文字列が「BA」と言わせて含まれているかどうかをチェックするために、この配列をフィルタリングします。 私は
Albania, Bahrain, Barbados, Zimbabwe 

を返します。しかし、私は実際に文字の順序が問題にしたい

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

で簡単にこれを行うことができます。したがって、「アルバニア」と「ジンバブエ」の結果は表示されず、「バーレーン」と「バルバドス」のみがBaで始まります。

巨大なforループが各文字を個別にチェックするすべてのエントリーを通過するのを避ける方法はありますか?

答えて

3

このような代わり.containsの使用.hasPrefix、:これは大文字と小文字が区別されること

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

これは、フィルタのテストを適用する前に、国の名前を小文字に、しかし、元の配列は変更されませんので、その結果を持っています同じ場合。

あなたは間違って読みやすくするために2つのステップで、この操作が必要になりますので、これは重要です:

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

しかし、フィルタは、今小文字のアレイに適用されているので、これは["bahrain", "barbados"]を返します。

+0

元の配列をそのまま維持するために 'countries.filter {$ 0.lowercased()。hasPrefix(" ba ")}'を 'map'なしで使うことをお勧めします。 – valcanaia

+0

これは、私が「間違って」答えのその部分の前に付いている理由です。 – Abizern

+1

本当に、気づかなかった、私の悪い! – valcanaia

関連する問題