How to Sort by Multiple Properties in Swift?
Sorting on collection is very easy for single criteria. Swift already has a built-in function for that called
sorted (Its in-place variant, called
sort). But, sometimes we need to sort the collection by multiple properties or criteria.
To understand this, let’s create a simple
Student with the roll number, name, address, and age property.
In order to sort the student list by
address we can use the following code:
return $0.address < $1.address
But what happens when the address value will be the same? That’s where multiple criteria sorting comes into the picture.
What is the meaning of multiple criteria sorting?
Multiple criteria sorting mean, two objects are compared by the first criteria. If those criteria are the same, then ties will be broken by the next criteria, and so on until you get the desired ordering.
Now, we will sort the student list by
age. It means we first compare the
address value and if the
address value will be the same, we will sort by
As you can see, its not complex to perform sorting by two criteria. But what happens if
age both have the same values? In that case we have to introduce the third property to sort the data.
Of course, we can use the same solution as above by adding one more
if condition. But as the number of criteria increases, more nested
if condition we have to perform which will cause the pyramid of doom problem.
To solve the pyramid of doom, we can use the swift’s
Tuples type which was introduced in Swift 4.
Tuples type are used to group multiple values in a single compound Value. The values in a tuple can be of any type, and do not need to be of same type.
In order to sort the data by multiple criteria, we will create the tuple in the same order we are looking to break the ties. So in our case, we will create tuples of
(address, age, rollNumber)
It will compare the first values of the tuples together, and, in the case of a tie, continue to compare the next tuple values.
In the above example we have sorted the student list in ascending for all three proprties (address, age and roll number). However, sometime you want to perform different sorting technique for different property.
For example, We want to sort the student list by
age in ascending, but
rollNumber in descending. In that case, we will interchange the
rollNumber property in tuple as below.
Please feel free to comment below, if you have any questions.
If you like this article, feel free to share it with your friends and leave me a comment. Also, click on the 👏 clap button below to show how much you like the article.
Thanks for reading! 👨🏼💻
You can find me on:
Twitter | LinkedIn | GitHub | Medium | HackerRank | LeetCode | Stack Overflow