比较两个列表以查看缺少的内容

时间:2018-12-31 11:31:13

标签: swift

如果我有两个列表,例如列表1和列表2,我将如何搜索列表1以查看是否有任何元素不在列表2中,然后append it to list2。作为示例,下面是两个列表:

let list1 = ["James","John","fat","cart"]
var list2 = ["James","fat","bobby"]

因此在算法list2之后将是:

["James","fat","bobby","John,"cart"]

4 个答案:

答案 0 :(得分:4)

for value in list1 {
  if !list2.contains(value) {
    list2.append(value)
  }
}

OR

list1.forEach({ !list2.contains($0) ? list2.append($0) : nil })

OR

list2.append(contentsOf: Set(list1).subtracting(Set(list2)))

使用foreach循环遍历list1中的项目。如果list2不包含任何项目,则将其附加到list2。*

答案 1 :(得分:3)

您可以进行一行编码

let list1 = ["James","John","fat","cart"]
var list2 = ["James","fat","bobby"]

list2.append(contentsOf: list1.filter{!list2.contains($0)})
print("\list2")

//output
["James", "fat", "bobby", "John", "cart"]

答案 2 :(得分:2)

您需要像这样使用Set

let list1 = ["James","John","fat","cart"]
let list2 = ["James","fat","bobby"]

let final = Array(Set([list1, list2].flatMap({$0})))

let final = Array(Set(list1 + list2))

答案 3 :(得分:2)

到目前为止,大多数答案在大型阵列上的性能都较差。

Array.contains(_:)方法的性能为O(n),这意味着将两个数组组合在一起将具有O(n•m)的性能(其中n是一个数组中的项目数,{{1 }}是另一个数组中的项目数。)随着数组大小的增加,时间性能将成倍下降。

如果您只需要处理少量物品,那就没关系。但是,如果阵列中有> =数百个项目,则时间性能会快速变差。

更好地使用集合:

m

集合使用散列进行包含/唯一性测试,该测试在大约恒定时间内运行。

Jorgandar的答案也应该具有良好的时间性能,但是我的答案要简单一些,而且(我认为)更容易理解。

我只是将每个数组转换为let list1 = ["James","John","fat","cart"] var list2 = ["James","fat","bobby"] list2 = Array(Set(list1).union(Set(list2))) print(Set([list1, list2])) print(list2) ,将它们与Set合并,然后将结果转换回集合。

如果保留原始顺序很重要,则可以从每个数组中构建集以进行唯一性测试,然后使用这些集循环遍历其中一个数组,以告知是否需要将每个项目添加到另一个数组中。这会稍微复杂一点,但是应该提供≈{Set.union(_:)的性能保留数组顺序。