How to rank elements of a sequence in Scala

1 Answer

0 votes
import scala.collection.mutable

/*
    FUNCTION: getRanks
    -------------------
    Computes competition-style ranks for a sequence of numbers.

    Ranking rules (Competition Ranking):
    ------------------------------------
    - Highest value gets rank 1
    - Equal values share the same rank
    - Next rank increases by the number of equal values

    Example:
        Values: 88, 4, 19, 4, 1, 31, 14, 1, 93, 17
        Ranks:   2, 7,  4, 7, 9,  3,  6, 9,  1,  5

    Steps:
    1. Create a sorted copy (descending)
    2. Assign ranks to each unique value
    3. Build a rank list matching the original order
*/

object CompetitionRanking {

  // FUNCTION: getRanks
  def getRanks(seq: Seq[Int]): Seq[Int] = {
    // Step 1: Create a sorted copy (descending)
    val sorted = seq.sorted(using Ordering[Int].reverse)

    // Step 2: Map each unique value to its rank
    val rankMap = mutable.Map[Int, Int]()
    var rank = 1

    for (value <- sorted) {
      // Assign rank only once per unique value
      if (!rankMap.contains(value)) {
        rankMap(value) = rank
      }
      rank += 1 // next rank position
    }

    // Step 3: Build ranking list in original order
    seq.map(value => rankMap(value))
  }

  // FUNCTION: printRanking
  def printRanking(seq: Seq[Int], ranks: Seq[Int]): Unit = {
    println(s"Original seq: [ ${seq.mkString(" ")} ]")
    println(s"Ranking seq : [ ${ranks.mkString(" ")} ]")
  }

  // MAIN PROGRAM
  def main(args: Array[String]): Unit = {
    val seq = Seq(88, 4, 19, 4, 1, 31, 14, 1, 93, 17)

    // Compute ranks
    val rankingSeq = getRanks(seq)

    printRanking(seq, rankingSeq)
  }
}


/*
run:

Original seq: [ 88 4 19 4 1 31 14 1 93 17 ]
Ranking seq : [ 2 7 4 7 9 3 6 9 1 5 ]

*/

 



answered Jun 21 by avibootz

Related questions

...