找出两个Swift Arrays是否包含相同的元素

时间:2016-06-18 18:29:48

标签: arrays swift equality

我有两个数组

let a1 = [obj1, obj2, obj3]
let a2 = [obj3, obj2, obj1]

假设数组元素是不可排序的自定义对象。我只想检查Array是否包含任何顺序的相同元素。

我试过了:

if a1==a2 { print("S1 is the same as S2") }
else { print("S1 is not the same as S2") }

但我得到" S1与S2"不同作为输出。

我能想到的只有两个解决方案

  • 排序和比较(如果元素不可排序,比如复数,则不起作用)
  • 从另一个
  • 中减去一个数组

是否有任何内置函数或操作来检查它们是否相等,而不考虑订单?

我发现How do I check in Swift if two arrays contain the same elements regardless of the order in which those elements appear in?只有可排序 Array的答案。

3 个答案:

答案 0 :(得分:5)

如果项目是唯一且相等的(如您的示例所示),请转换为Set并比较集合:

let a1 = [1, 2, 3]
let a2 = [3, 2, 1]
Set(a1) == Set(a2)

有了一些困难,这可以适用于任意级别:

class Person : NSObject {
    let name: String
    init(name:String) {self.name = name}
    override func isEqual(other: AnyObject?) -> Bool {
        return other is Person && (other as! Person).name == self.name
    }
    override var hashValue : Int {
        return self.name.hashValue
    }
}

let a1 = [Person(name:"Matt"), Person(name:"Sam")]
let a2 = [Person(name:"Sam"), Person(name:"Matt")]
Set(a1) == Set(a2)

答案 1 :(得分:2)

如果数组有重复项,这两个解决方案也可以

场景1:元素是可排序的

let a1 = [1, 2, 3]
let a2 = [3, 2, 1]

let equals = a1.sorted() == a2.sorted()

时间复杂度:我们需要对两个数组进行排序,以便时间复杂度 O(n * log n)+ O(m * log m)

空间复杂性:创建两个数组的临时副本,因此所需空间为 O(n)+ O(m)

其中na1m中元素的数量,a2中的元素数量。

场景2:元素不可排序

func equals<Element:Equatable>(listA:[Element], listB:[Element]) -> Bool {
    guard listA.count == listB.count else { return false }

    var listB = listB

    for a in listA {
        if let indexB = listB.indexOf(a) {
            listB.removeAtIndex(indexB)
        } else {
            return false
        }
    }

    return listB.isEmpty
}

时间复杂度:我们正在迭代第一个数组,每次我们对第二个数组执行线性搜索,所以 O(n * m)

空间复杂性:我们创建了第二个数组的副本,因此 O(m)

答案 2 :(得分:2)

您可以将它们转换为SetNSSet个实例,这些实例按定义未排序并进行比较。更好的是,根本不考虑使用数组,首先考虑使用集合。

let a1 = [1, 4, 5]
let a2 = [4, 5, 1]
let s1 = NSSet(array: a1)
let s2 = NSSet(array: a2)
print(s1 == s2) // Prints "true"

如果对象可能在数组中出现多次,则需要使用NSCountedSet来计算每个对象出现在集合中的频率:

let a1 = [1, 1, 2]
let a2 = [1, 2, 2]

let s1 = NSSet(array: a1)
let s2 = NSSet(array: a2)
print(s1 == s2) // Prints "true"

let c1 = NSCountedSet(array: a1)
let c2 = NSCountedSet(array: a2)
print(c1 == c2) // Prints "false"