# What is the order of element in collect(s::Set)?

Does anyone know what governs this? Is it safe to assume that the order is fixed as is multiple call to `collect(s)` gives the same Array (based on my limited experimentation)?

probably, but you shouldnâ€™t rely on this because `Set` is designed to have arbitrary order when you collect/iterate through them.

1 Like

For a given Julia version, if the set is constructed in the same way, the order of iteration is fixed. The second condition matters, as e.g. on the version I use, I get:

``````julia> Set([11, 2])
Set{Int64} with 2 elements:
11
2

julia> Set([2, 11])
Set{Int64} with 2 elements:
2
11

julia> Set([2, 11]) == Set([11, 2])
true
``````

``````julia> s = Set([11,2])
Set{Int64} with 2 elements:
11
2

julia> ss = Set([2,11])
Set{Int64} with 2 elements:
2
11

julia> s == ss
true

julia> collect(s)
2-element Vector{Int64}:
11
2

julia> collect(s)
2-element Vector{Int64}:
11
2

julia> collect(ss)
2-element Vector{Int64}:
2
11

julia> collect(ss)
2-element Vector{Int64}:
2
11

julia> collect(s) == collect(ss)
false

julia>
``````

Set is a mathematical concept defined by â€śTwo sets are equal if and only if they have precisely the same elementsâ€ť (Wikipedia). Sets are useful if you want to remove duplicates and for cases where you donâ€™t care about the ordering.

Therefore, itâ€™s not a good idea to assume the order is fixed when you do `collect(s)`.

Depending on what you need exactly, maybe `sort(collect(s))` would be a solution.

5 Likes

Or if you need to preserve the ordering of the first time an element is encountered using the function `unique` will work, instead of converting to a set and back.
https://docs.julialang.org/en/v1/base/collections/#Base.unique

Thanks guys. I have no clue how `Set` works internally (probably build upon `Dict` or `Array`), and based on this `collect` would probably give a â€śnaturalâ€ť ordering in the resulting `Array` container. I am purely guessing here but the order could depends on memory layout.

@WschW thanks for this tip (I was not aware of the order-preserving property of `unique`) but it is not what I am after.

`Set` does not guarantee any kind of ordering, itâ€™s by definition an unordered data structure.

DataStructures.jl has an `OrderedSet` type which guarantees the insertion order when iterated over.

3 Likes