2016-04-14 12 views
0

私は以下のような辞書があり、赤い犬の配列が欲しいと言います。私は、最初の辞書を使って "dog"というタイプのすべての名前の配列を取得し、そして最後の辞書を検索するために名前のキーと色を使用する必要があると考えました[Polly、 "jake"]。 loopsを使用してbut dictionary through iterateするhow out figureないことができtried veスウィフト辞書すべてが含まれています

var pets = ["Polly" : "dog", "Joey" : "goldfish", "Alex" : "goldfish", "jake" : "dog"] 

var petcolor = ["Polly" : "red", "Joey" : "black", "Alex" : "yellow", "jake":red"] 
+1

辞書よりもオブジェクトを使用する方が良いでしょう。 – brimstone

答えて

1

The正しい解決策はtと思われるo Pet構造体(またはクラス)を作成し、この情報のすべてを構造体に照合し、これらの値でいっぱいの配列または辞書を構築します。

struct Pet { 
    let name: String 
    let type: String 
    let color: String 

    init(name: String, type: String, color: String) { 
     self.name = name 
     self.type = type 
     self.color = color 
    } 
} 

さて、これらのペットの配列を作成してみましょう:

var goodPets = [Pet]() 

for (petName, petType) in pets { 
    guard let petColor = petcolor[petName] else { 
     // Found this pet's type, but couldn't find its color. Can't add it. 
     continue 
    } 

    goodPets.append(Pet(name: petName, type: petType, color: petColor)) 
} 

は、今、私たちはgoodPetsを記入したので、ペットのいずれかの特定のサブセットを引き出すのは容易非常に次のようになります。

let redDogs = goodPets.filter { $0.type == "dog" && $0.color = "red" } 

この回答は、他の回答と比較して多くの設定のようですが、&の足跡は、ここで年齢はgoodPetsアレイを構築すると、任意私たちはそこからペットを掬いたい方がより効率的になります。そして、ペットが持つプロパティの数を増やすと、これは他の回答と比較してますます真実になります。

あなたではなく、キーのような名前を使い続ける辞書に我々のモデルオブジェクトを格納したい場合は、我々は同様にそれを行うことができます

が、フィルターは少し見知らぬ人を探します。

var goodPets = [String : Pet]() 

for (petName, petType) in pets { 
    guard let petColor = petcolor[petName] else { 
     // Found this pet's type, but couldn't find its color. Can't add it. 
     continue 
    } 

    goodPets[petName] = (Pet(name: petName, type: petType, color: petColor)) 
} 

しかし、フィルタが若干異なります。:辞書の構築

が同じほとんどに見える

let redDogs = goodPets.filter { $0.1.type = "dog" && $0.1.color = "red" } 

注両方のケースでは、redDogsはタイプ[Pet]を持っていること、つまり、 Pet値の配列

+0

私は基準を追加する予定ですので、これを使用します。ユーザーが色ではなくタイプを入力すると言うことができます:色の基準の欠如を無視し、if文の束なしですべての犬を与える方法はありますか? – user3015221

+0

@ user3015221この時点から、*動作する*を実装し、[Code Review](http://codereview.stackexchange.com/help/on-topic)に移動してクリーンアップしてください。 – nhgrif

0

はYouは、このlike dictionary through iterateできる:。

for key in pets.keys() { 
    if pets[key] == "Dog" { 

    } 
} 

か:

for (name, pet) in pets { 
    if pet == "Dog" { 
    } 
} 
+0

ありがとうございました! – user3015221

0

nhgrifはおそらく構造に関する正しいですが、文字通りの質問に答えるために:

let dogs = Set(pets.filter { $0.1 == "dog" }.map { $0.0 }) 
let redAnimals = Set(petscolor.filter { $0.1 == "red" }.map { $0.0 }) 

let redDogs = dogs.intersect(redAnimals) 

filterして値をテストし、(キー、値)タプルで動作ブロックであり、最終的に持つ辞書を作成します一致する(キー、値)のペアのみ。各mapは、値を破棄してキーを保持するだけで、フィルタリングされた辞書を配列に変換します。

各アレイは、intersectオペレーションをサポートするためのセットになります。 intersectは、2つの結果の交差を決定します。

関連する問題