/*
How to rank elements of an integer array based on their sorted order in Scala
-----------------------------------------------------------------------------
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
*/
object RankArrayApp {
// ------------------------------------------------------------
// Function 1: Print the array
// ------------------------------------------------------------
def printArray(arr: Array[Int]): Unit = {
println("Array: " + arr.mkString("[", ", ", "]"))
}
// ------------------------------------------------------------
// Function 2: Create a copy of the array
// ------------------------------------------------------------
def copyArray(arr: Array[Int]): Array[Int] = {
arr.clone()
}
// ------------------------------------------------------------
// Function 3: Sort the array copy
// ------------------------------------------------------------
def sortArray(arrCopy: Array[Int]): Unit = {
scala.util.Sorting.quickSort(arrCopy)
}
// ------------------------------------------------------------
// Function 4: Build a map of value → rank
// ------------------------------------------------------------
def buildRankMap(sortedArr: Array[Int]): Map[Int, Int] = {
var rank = 1
var previous = sortedArr(0)
var rankMap = Map(previous -> rank)
for (i <- 1 until sortedArr.length) {
val current = sortedArr(i)
if (current != previous) {
rank += 1
}
rankMap += (current -> rank)
previous = current
}
rankMap
}
// ------------------------------------------------------------
// Function 5: Apply ranks to original array order
// ------------------------------------------------------------
def applyRanks(original: Array[Int], rankMap: Map[Int, Int]): Array[Int] = {
original.map(value => rankMap(value))
}
// ------------------------------------------------------------
// Main ranking function
// ------------------------------------------------------------
def rankArray(arr: Array[Int]): Unit = {
printArray(arr)
if (arr.isEmpty)
return
// Step 1: Copy array
val arrCopy = copyArray(arr)
// Step 2: Sort the copy
sortArray(arrCopy)
// Step 3: Build rank map
val rankMap = buildRankMap(arrCopy)
// Step 4: Apply ranks to original order
val ranked = applyRanks(arr, rankMap)
println("Rank: " + ranked.mkString("[", ", ", "]"))
}
// ------------------------------------------------------------
// MAIN METHOD
// ------------------------------------------------------------
def main(args: Array[String]): Unit = {
val arr = Array(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]
*/