How to rank elements of an array in Java

1 Answer

0 votes
import java.util.Collections;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Arrays;
import java.util.List;
import java.util.Map;


/**
    This program demonstrates how to compute "competition ranking"
    for an array of integers in Java.

    Competition Ranking Rules:
    --------------------------
    - 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
*/
public class CompetitionRanking {

    /**
        FUNCTION: getRanks
        -------------------
        Computes competition-style ranks for an array of integers.

        Steps:
        1. Make a sorted copy of the array (descending)
        2. Assign ranks to each unique value
        3. Build a rank array matching the original order
    */
    public static List<Integer> getRanks(List<Integer> arr) {

        // Step 1: Create a sorted copy (descending)
        List<Integer> sorted = new ArrayList<>(arr);
        sorted.sort(Collections.reverseOrder());

        // Step 2: Map each unique value to its rank
        Map<Integer, Integer> rankMap = new HashMap<>();
        int rank = 1;

        for (int value : sorted) {
            // Assign rank only once per unique value
            if (!rankMap.containsKey(value)) {
                rankMap.put(value, rank);
            }
            rank++; // next rank position
        }

        // Step 3: Build ranking list in original order
        List<Integer> result = new ArrayList<>();
        for (int value : arr) {
            result.add(rankMap.get(value));
        }

        return result;
    }

    /**
        FUNCTION: printRanking
        -----------------------
        Prints the original array and its ranking.
    */
    public static void printRanking(List<Integer> arr, List<Integer> ranks) {
        System.out.println("Original array: " + arr);
        System.out.println("Ranking array : " + ranks);
    }

    // MAIN PROGRAM
    // ---------------------------------------------
    public static void main(String[] args) {

        List<Integer> array = Arrays.asList(88, 4, 19, 4, 1, 31, 14, 1, 93, 17);

        // Compute ranks
        List<Integer> rankingArray = getRanks(array);
        
        printRanking(array, rankingArray);
    }
}


/*
run:

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

*/

 



answered 2 days ago by avibootz
...