查找两个Swift数组是否包含相同的元素

Sar*_*ran 0 arrays equality swift

我有两个数组

let a1 = [obj1, obj2, obj3]
let a2 = [obj3, obj2, obj1]
Run Code Online (Sandbox Code Playgroud)

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

我尝试了这个:

if a1==a2 { print("S1 is the same as S2") }
else { print("S1 is not the same as S2") }
Run Code Online (Sandbox Code Playgroud)

但我得到“ S1与S2不同”的输出。

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

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

是否有任何内置函数或操作可以检查它们是否相等,而无需考虑顺序?

我发现了如何在Swift中检查两个数组是否包含相同的元素,而不管这些元素出现的顺序如何?仅对sortable Array s 有答案。

mat*_*att 6

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

let a1 = [1, 2, 3]
let a2 = [3, 2, 1]
Set(a1) == Set(a2)
Run Code Online (Sandbox Code Playgroud)

稍作改动,就可以使它适用于任意类:

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)
Run Code Online (Sandbox Code Playgroud)