如果我有两个列表,例如列表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"]
答案 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(_:)
的性能并保留数组顺序。