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

1 Answer

0 votes
/*
    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]

*/

 



answered 13 hours ago by avibootz

Related questions

...