Kotlin – Sort an Array based on another Array

Sort an Array based on the content of another Array in Kotlin

This is a situation where we have two Arrays, and we would like to sort the contents of the first array based on the values of the second array.

For example, say that we have an array of fruit names, and an array of their respective available stocks. We would like to sort the fruit names based on their available stocks.

Given arrays
------------
array1   [apple, banana, cherry, mango, fig]
array2   [5, 2, 8, 3, 1]

apple  -> 5
banana -> 2
cherry -> 8
mango  -> 3
fig    -> 1

After rearrangement / sorting
-----------------------------
array1   [fig, banana, mango, apple, cherry]
array2   [1, 2, 3, 5, 8]

fig    -> 1
banana -> 2
mango  -> 3
apple  -> 5
cherry -> 8

And let us see how to do that.

To sort an Array based on another Array in Kotlin,

Step 1 : Sort the indices of the second Array, based on the values.

val sortedIndicesArray2 = array2.indices.sortedBy { array2[it] }

Now, we have the order of indices in which we have to arrange the first array.

Step 2 : Create array from the indices returned in the above step, and the elements from the first Array.

val sortedArray1 = sortedIndicesArray2.map { array1[it] }.toTypedArray()

sortedArray1 has elements of first Array which are arranged in the ascending order of the elements from second Array.

Examples

Sort the Array fruitNames based on the Array stocks

In the following program, we take two Arrays: array1 and array2. The Arrays are named this way to easily understand the example. The array1 consists of fruit names, and the array2 consists of the respective available stocks. And we are going to rearrange the elements of array1 such that they are ordered in ascending order of their respective available stocks.

Kotlin Program

fun main(args: Array<String>) {
    val array1 = arrayOf("apple", "banana", "cherry", "mango", "fig")
    val array2 = arrayOf(5, 2, 8, 3, 1)

    val sortedIndicesArray2 = array2.indices.sortedBy { array2[it] }
    val sortedArray1 = sortedIndicesArray2.map { array1[it] }.toTypedArray()
    println(sortedArray1.contentToString())
}

Output

[fig, banana, mango, apple, cherry]

Explanation

Given arrays
------------
array1   [apple, banana, cherry, mango, fig]
array2   [5, 2, 8, 3, 1]

apple  -> 5
banana -> 2
cherry -> 8
mango  -> 3
fig    -> 1

After rearrangement / sorting
-----------------------------
array1   [fig, banana, mango, apple, cherry]
array2   [1, 2, 3, 5, 8]

fig    -> 1
banana -> 2
mango  -> 3
apple  -> 5
cherry -> 8