How to rank elements of an integer array based on their sorted order in Kotlin

1 Answer

0 votes
/*
    How to rank elements of an integer array based on their sorted order in Kotlin
    ------------------------------------------------------------------------------

    Ranking rules:
    - Lowest value gets rank 1
    - Equal values share the same rank
    - Rank increases only when encountering a new unique value

    Steps:
    1. Print the original array
    2. Create a copy of the array
    3. Sort the copy
    4. Build a map (value → rank)
    5. Apply ranks back to the original order
*/

// ------------------------------------------------------------
// Function 1: Print the array
// ------------------------------------------------------------
fun printArray(arr: IntArray) {
    println("Array: ${arr.contentToString()}")
}

// ------------------------------------------------------------
// Function 2: Create a copy of the array
// ------------------------------------------------------------
fun copyArray(arr: IntArray): IntArray {
    return arr.copyOf()
}

// ------------------------------------------------------------
// Function 3: Sort the array copy
// ------------------------------------------------------------
fun sortArray(arrCopy: IntArray) {
    arrCopy.sort()
}

// ------------------------------------------------------------
// Function 4: Build a map of value → rank
// ------------------------------------------------------------
fun buildRankMap(sortedArr: IntArray): Map<Int, Int> {

    val map = mutableMapOf<Int, Int>()

    var rank = 1
    var previous = sortedArr[0]

    map[previous] = rank

    for (i in 1 until sortedArr.size) {
        val current = sortedArr[i]

        if (current != previous) {
            rank++
        }

        map[current] = rank
        previous = current
    }

    return map
}

// ------------------------------------------------------------
// Function 5: Apply ranks to original array order
// ------------------------------------------------------------
fun applyRanks(original: IntArray, rankMap: Map<Int, Int>): IntArray {
    val ranked = IntArray(original.size)

    for (i in original.indices) {
        ranked[i] = rankMap[original[i]]!!
    }

    return ranked
}

// ------------------------------------------------------------
// Main ranking function
// ------------------------------------------------------------
fun rankArray(arr: IntArray) {

    printArray(arr)

    if (arr.isEmpty()) return

    val arrCopy = copyArray(arr)
    sortArray(arrCopy)

    val rankMap = buildRankMap(arrCopy)

    val ranked = applyRanks(arr, rankMap)

    println("Rank: ${ranked.contentToString()}")
}

// ------------------------------------------------------------
// MAIN FUNCTION
// ------------------------------------------------------------
fun main() {

    val arr = intArrayOf(33, 99, 10, 25, 47, 11, 77)

    rankArray(arr)
}


/*
run:

Array: [33, 99, 10, 25, 47, 11, 77]
Rank: [4, 7, 1, 3, 5, 2, 6]

*/

 



answered Jun 22 by avibootz

Related questions

...