2017-06-26 73 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

相关问题