2017-06-26 76 views
1

我有兩個數組,從其中一個必須完成的其他:如何將數組中的值添加到另一個數組中?

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

我怎麼能完成從第二值的第一陣列的方式,結果是這樣的:

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), 
] 

通常我會張貼我的嘗試草稿,但由於我很新很快,我不得不承認我不知道。感謝您的任何建議。

+0

A *字典*(映射名稱的結果)將是一個更適合類型的分數。它允許有效地查找和更新條目。 –

回答

3

最終你或許應該重新考慮你的模型,可能與某種「播放器」模式,使你不具備這種脫節的。這裏

FWIW是用字典來做到這一點更安全/簡單的方法:

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

'讓結果:[Score] = Array(scoresDictionary.values)'從詞典中獲得Score值並將它們放入數組 – PeejWeej

+0

非常感謝!我剛剛嘗試了一個非常大的陣列。它工作得很好。 –

+0

@ PEEJWEEJ:是的,我只是匆忙地看着它。 –

0

基本上我們只是迭代scores,尋找匹配Complete。如果我們找到一個,我們會返回Score,其屬性集合爲isComplete集合truefalse。如果我們找不到,我們將原來的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

我只是試了一下,它太棒了!需要一點時間來準確理解它是如何工作的。非常感謝你!還有一個問題:這個方法是否爲每個「完整」值重複「分數」?所以在這種情況下5次?因爲我的Score數組很大。 –

+0

@MartinR謝謝,更新! @Josch Hazard,不,它迭代'scores'一次,可能爲'scores'中的每個值迭代整個'complete'數組。所以如果'scores'很大,而且'complete'相對較短,這應該是一個非常快的解決方案。 – paulvs

相關問題