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