Question: I have two arrays

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

```

Assume that the array elements are custom objects which are **not sortable**. I just want to check if the `Array`s contain the same elements, in any order.

I tried this: 

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

```

but I get "S1 is not the same as S2" as output.

All I could think of are two solutions

* Sort and compare (doesn't work if elements are not sortable, say complex numbers)
* Subtract one array from the other

Is there any built-in function or operation to check if they are equal, without considering order?

I found [How do I check in Swift if two arrays contain the same elements regardless of the order in which those elements appear in?](https://stackoverflow.com/questions/36714522/how-do-i-check-in-swift-if-two-arrays-contain-the-same-elements-regardless-of-th) which has the answer only for **sortable** `Array`s.

Answer: 
If the items are unique and equatable (as in your example), convert to a Set and compare the Sets:

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

```

With some futzing, this can be made to work for an arbitrary class:

```
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)

```
You can convert them into `Set` or `NSSet` instances which are unsorted by definition and compare those. Better yet, instead of using arrays at all, consider using sets in the first place.

```
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"

```

If objects may appear multiple times in your arrays, you need to use a `NSCountedSet` instead which also counts how often each object occurs in a set:

```
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"

```