首页 > 解决方案 > Swift - 查找结构数组中的特定差异

问题描述

如果我有一个结构,请说:

struct Subject { 
 var subjectID: String?
 var name: String?
 var note: String?
}

我有两个这种结构的数组:Array1 和 Array2。

例如:

Array1 = [(subjectID = "T", name = "H", note = "DF"), (subjectID = "F", name = "H", note = "SD")]
Array2 = [(subjectID = "T", name "G", note = "DF"), (subjectID = "R", name = "F", note = "SDF")]

我想返回一个新数组,它由与字段Array2匹配但具有不同和/或元素的元素子集组成。subjectIDArray1namenote

在上面的示例中,返回的数组将是:

[(subjectID = "T", name "G", note = "DF")]

因为它包含与 in 相同subjectID(在这种情况下T),Array1name字段不同。请注意,这个新返回数组的字段应该是原始值Array2(例如:您不需要更正它们以匹配Array1

有没有一种简单的方法(例如:一两行代码)可以做到这一点而无需暴力破解?

谢谢!

标签: arraysswiftfilterstructure

解决方案


这里有很好的答案,我更喜欢保持测试简单。

首先是设置

struct Subject {
    var subjectID: String?
    var name: String?
    var note: String?
}

let array1 = [Subject(subjectID: "T", name: "H", note: "DF"), Subject(subjectID: "F", name: "H", note: "SD")]
let array2 = [Subject(subjectID: "T", name: "G", note: "DF"), Subject(subjectID: "R", name: "F", note: "SDF")]

现在让我们看看实际的算法。返回块返回的sarray2.filter数组。如果return中的任何s则返回。测试本身正是您所描述的。主题 ID 是否相同,名称或注释是否不同。Subjectarray2truearray1.containstrueSubjectarray1true

let result = array2.filter { s2 in
    array1.contains { s1 in
        s1.subjectID == s2.subjectID && (s1.name != s2.name || s1.note != s2.note)
    }
}

推荐阅读