2017-06-26 23 views
1

私は1つが完了していたから、二つの配列を持つ他:あるアレイの値を別のアレイに追加する方法は?

let result = [ 
    Score(name: "Steven", isComplete: true, finalScore: 12), 
    Score(name: "Helen", isComplete: true, finalScore: 12), 
    Score(name: "Adalbert", isComplete: false, finalScore: 12), 
    Score(name: "Christian", isComplete: false, finalScore: 12), 
    Score(name: "Susan", isComplete: false, finalScore: 3), 
    Score(name: "Julia", isComplete: false, finalScore: 13), 
    Score(name: "Robert", isComplete: false, finalScore: 13), 
    Score(name: "Mercedes", isComplete: false, finalScore: 2), 
    Score(name: "Gwendolin", isComplete: true, finalScore: 2), 
] 
:私は結果はこのように見えるような方法で第二の値を持つ最初の配列を完了できるか

struct Score { 
    let name: String 
    let isComplete: Bool 
    let finalScore: Int 
} 

var scores = [ 
    Score(name: "Steven", isComplete: false, finalScore: 12), 
    Score(name: "Helen", isComplete: false, finalScore: 12), 
    Score(name: "Adalbert", isComplete: false, finalScore: 12), 
    Score(name: "Christian", isComplete: false, finalScore: 12), 
    Score(name: "Susan", isComplete: false, finalScore: 3), 
    Score(name: "Julia", isComplete: false, finalScore: 13), 
    Score(name: "Robert", isComplete: false, finalScore: 13), 
    Score(name: "Mercedes", isComplete: false, finalScore: 2), 
    Score(name: "Gwendolin", isComplete: false, finalScore: 2), 
] 



struct Complete { 
    let name: String 
    let isComplete: Bool 
} 

var complete = [ 
    Complete(name: "Steven", isComplete: true), 
    Complete(name: "Helen", isComplete: true), 
    Complete(name: "Mercedes", isComplete: false), 
    Complete(name: "Gwendolin", isComplete: true), 
    // Name doesn´t exist in `score` and shouldn´t show up in the result: 
    Complete(name: "nonexistingName", isComplete: true) 
] 

通常、私は自分の試行の草稿を投稿しますが、私は非常に速いので、私は分かりません。アドバイスありがとう。

+0

*辞書*(結果に名前をマッピングする)スコアに適しタイプのようになります。

FWIWは、ここでは、辞書でこれを行うにはより安全な/シンプルな方法です。エントリを効率的に検索および更新することができます。 –

答えて

3

は最終的に、あなたはおそらく、「プレイヤー」モデルのいくつかの並べ替えで、おそらく、あなたのモデルを再考すべきです。

struct Score { 
    let name: String 
    var isComplete: Bool 
    let finalScore: Int 
} 

struct Complete { 
    let name: String 
    let isComplete: Bool 
} 

var scoresDictionary: [String : Score] = [:] 

// this populates scoresDictionary with your array, keyed with the names 
[ Score(name: "Steven", isComplete: false, finalScore: 12), 
    Score(name: "Helen", isComplete: false, finalScore: 12), 
    Score(name: "Adalbert", isComplete: false, finalScore: 12), 
    Score(name: "Christian", isComplete: false, finalScore: 12), 
    Score(name: "Susan", isComplete: false, finalScore: 3), 
    Score(name: "Julia", isComplete: false, finalScore: 13), 
    Score(name: "Robert", isComplete: false, finalScore: 13), 
    Score(name: "Mercedes", isComplete: false, finalScore: 2), 
    Score(name: "Gwendolin", isComplete: false, finalScore: 2), 
    ].forEach { scoresDictionary[$0.name] = $0} 

let complete = [ 
    Complete(name: "Steven", isComplete: true), 
    Complete(name: "Helen", isComplete: true), 
    Complete(name: "Mercedes", isComplete: false), 
    Complete(name: "Gwendolin", isComplete: true), 
    // Name doesn´t exist in `score` and shouldn´t show up in the result: 
    Complete(name: "nonexistingName", isComplete: true) 
] 

//Updates only the found values in scoresDictionary 
complete.forEach { scoresDictionary[$0.name]?.isComplete = $0.isComplete } 

// The dictionary is updated, but in case you just want the Scores, this gives you an array 
let result: [Score] = Array(scoresDictionary.values) 
+0

'let result:[Score] = Array(scoresDictionary.values)'は辞書からスコア値を取得して、配列に入れています – PeejWeej

+0

ありがとう!私はちょうど非常に大きな配列で試しました。それは絶対にうまくいっている。 –

+0

@ PEEJWEEJ:ええ、私は急いでそれを監督しました。 –

0

基本的にはscoresを繰り返し、一致するものを探すのはCompleteです。見つけた場合は、isCompletetrueまたはfalseに設定してScoreを返します。見つからない場合は、元のScoreをそのまま返します。

var final: [Score] = scores.map { aScore in 

    let comp = complete.first { aScore.name == $0.name } 
    if let comp = comp { 
     return Score(name: aScore.name, isComplete: comp.isComplete || aScore.isComplete, finalScore: aScore.finalScore) 
    } 
    return aScore 
} 

final.forEach { 
    print($0.name, $0.isComplete, $0.finalScore) 
} 

プリント:あなたは、切断のこの種を持っていないので、

Steven true 12 
Helen true 12 
Adalbert false 12 
Christian false 12 
Susan false 3 
Julia false 13 
Robert false 13 
Mercedes false 2 
Gwendolin true 2 
+1

"filter + first"は 'first(where:)'を使って簡略化できます。 –

+0

私はただ試してみました。どのように動作するかを正確に理解するには少し時間が必要です。どうもありがとうございました!もう1つ質問:このメソッドはすべての単一の 'complete'値に対して'スコア 'を反復していますか?だからこの場合5倍?私のScore配列はかなり大きいので。 –

+0

@MartinRありがとう、更新しました! @Josch Hazard、いいえ、 'スコア 'を一度反復し、'スコア 'の各値に対して' complete'配列全体を繰り返し処理する可能性があります。したがって、 'スコア'が大きく、 '完全な'が比較的短い場合、これはかなり速い解決策であるはずです。 – paulvs

関連する問題