从两个数组中删除唯一值的最佳方法

时间:2015-06-25 06:49:09

标签: swift

我有两个[PFObjects]数组。

例如(简化):

arr1: [PFObject] = [1, 2, 3, 4, 5, 6, 7, 8]

arr2: [PFObject] = [1, 2, 3, 4, 5]

arr1arr2进行比较的唯一方法是什么,只保留重复项(删除唯一值)。

所以arr1看起来像:

arr1 = [1, 2, 3, 4, 5]

2 个答案:

答案 0 :(得分:6)

let array = arr1.filter { arr2.contains($0) }

瞧!

答案 1 :(得分:1)

第一个解决方案(循环播放):

var arr1: [PFObject] = [1, 2, 3, 4, 5, 6, 7, 8]
var arr2: [PFObject] = [1, 2, 3, 4, 5]

var temp: [PFObject] = []

for element in arr1 {
    if contains(arr2, element) {
        temp.append(element)
    }
}

arr1 = temp

您可以遍历第一个数组,检查数组中是否包含每个元素,如果是,则可以将其添加到临时数组中。循环遍历每个元素后,您可以用临时数组替换第一个数组的值。

第二个解决方案(套装):

var arr1: [PFObject] = [1, 2, 3, 4, 5, 6, 7, 8]
var arr2: [PFObject] = [1, 2, 3, 4, 5]

let set1 = Set(arr1)
let set2 = Set(arr2)

var arr1= Array(set1.intersect(set2))    // [1, 2, 3, 4, 5]

你在这里做的是:

  • 首先从数组创建集合
  • 然后使用sets中的intersect方法确定公共元素
  • 最后,在将集合传递回arr1
  • 之前,将其转换为数组

当然,既然你将使用套装,重复的元素将会丢失,但我猜你不应该成为问题

第三种解决方案(过滤器):

从Pham Hoan的答案中你可以使用过滤器来获取arr1的子集,闭包为你提供条件,这里是arr2包含你正在看的值。

let array = arr1.filter { arr2.contains($0) }

这显然是代码长度方面的较短解决方案。

如果你有非常大的数组,我不知道哪种技术会更有效。