How to rank elements of a vector in Rust

1 Answer

0 votes
use std::collections::HashMap;

/*
    FUNCTION: get_ranks
    -------------------
    This function takes a vector of numbers and returns a vector of ranks.

    Ranking rules used (Competition Ranking):
    -----------------------------------------
    - Highest value gets rank 1
    - Equal values get 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. Make a sorted copy of the vector (descending)
    2. Assign ranks to each unique value
    3. Build a rank vector matching the original order
*/
fn get_ranks(vec: &Vec<i32>) -> Vec<i32> {
    // Step 1: Create a sorted copy (descending)
    let mut sorted = vec.clone();
    sorted.sort_by(|a, b| b.cmp(a)); // descending order

    // Step 2: Map each unique value to its rank
    let mut rank_map: HashMap<i32, i32> = HashMap::new();
    let mut rank = 1;

    for value in sorted {
        // Assign rank only once per unique value
        rank_map.entry(value).or_insert(rank);
        rank += 1; // next rank position
    }

    // Step 3: Build ranking vector in original order
    vec.iter().map(|v| rank_map[v]).collect()
}

/*
    FUNCTION: print_ranking
    -----------------------
    Prints the original vector and its ranking.
*/
fn print_ranking(vec: &Vec<i32>, ranks: &Vec<i32>) {
    print!("Original vec: [ ");
    for v in vec {
        print!("{} ", v);
    }
    println!("]");

    print!("Ranking vec : [ ");
    for r in ranks {
        print!("{} ", r);
    }
    println!("]");
}

// MAIN PROGRAM
// ---------------------------------------------
fn main() {
    let vec = vec![88, 4, 19, 4, 1, 31, 14, 1, 93, 17];

    // Compute ranks
    let ranking_vec = get_ranks(&vec);

    print_ranking(&vec, &ranking_vec);
}


/*
run:

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

*/

 



answered 2 days ago by avibootz
...