How to sort a list of files by name, extension, dates, and size in Rust

1 Answer

0 votes
// ------------------------------------------------------------
// Date struct for proper date handling
// ------------------------------------------------------------
#[derive(Debug)]
struct Date {
    year: i32,
    month: i32,
    day: i32,
}

// ------------------------------------------------------------
// Print a date in YYYY-MM-DD format
// ------------------------------------------------------------
fn format_date(d: &Date) -> String {
    format!("{:04}-{:02}-{:02}", d.year, d.month, d.day)
}

// ------------------------------------------------------------
// File entry struct
// ------------------------------------------------------------
#[derive(Debug)]
struct FileEntry {
    name: String,       // File name without extension
    extension: String,  // Extension including dot
    date: Date,         // Real date struct
    size: i32,          // Bytes
}

// ------------------------------------------------------------
// Sort by name (lexicographically)
// ------------------------------------------------------------
fn sort_by_name(files: &mut Vec<FileEntry>) {
    files.sort_by(|a, b| a.name.cmp(&b.name));
}

// ------------------------------------------------------------
// Sort by extension (lexicographically)
// ------------------------------------------------------------
fn sort_by_extension(files: &mut Vec<FileEntry>) {
    files.sort_by(|a, b| a.extension.cmp(&b.extension));
}

// ------------------------------------------------------------
// Sort by date (year → month → day)
// ------------------------------------------------------------
fn sort_by_date(files: &mut Vec<FileEntry>) {
    files.sort_by(|a, b| {
        a.date.year
            .cmp(&b.date.year)
            .then(a.date.month.cmp(&b.date.month))
            .then(a.date.day.cmp(&b.date.day))
    });
}

// ------------------------------------------------------------
// Sort by size (ascending)
// ------------------------------------------------------------
fn sort_by_size(files: &mut Vec<FileEntry>) {
    files.sort_by(|a, b| a.size.cmp(&b.size));
}

// ------------------------------------------------------------
// Print file list
// ------------------------------------------------------------
fn print_files(files: &Vec<FileEntry>) {
    for f in files {
        println!(
            "{}{}  {}  {} bytes",
            f.name,
            f.extension,
            format_date(&f.date),
            f.size
        );
    }
    println!();
}

fn main() {
    let mut files = vec![
        FileEntry { name: "G1zTo5jJk".into(), extension: ".jpg".into(), date: Date { year: 2007, month: 7, day: 8 }, size: 51954 },
        FileEntry { name: "LTEE4SI0j".into(), extension: ".jpg".into(), date: Date { year: 2011, month: 11, day: 13 }, size: 43442 },
        FileEntry { name: "PDqmuO3GH".into(), extension: ".cpp".into(), date: Date { year: 2004, month: 5, day: 21 }, size: 3346 },
        FileEntry { name: "qJO2qjukZ".into(), extension: ".png".into(), date: Date { year: 2010, month: 8, day: 27 }, size: 67087 },
        FileEntry { name: "HqclTqxb4".into(), extension: ".cpp".into(), date: Date { year: 2020, month: 9, day: 5 }, size: 70531 },
        FileEntry { name: "imVyTyoaF".into(), extension: ".jpg".into(), date: Date { year: 2011, month: 3, day: 19 }, size: 43846 },
        FileEntry { name: "rXwXdy8XO".into(), extension: ".txt".into(), date: Date { year: 2017, month: 10, day: 12 }, size: 70193 },
        FileEntry { name: "9Z4fbOBUc".into(), extension: ".pdf".into(), date: Date { year: 2004, month: 6, day: 9 }, size: 1754 },
        FileEntry { name: "ZHahuu4vS".into(), extension: ".txt".into(), date: Date { year: 2003, month: 10, day: 10 }, size: 65126 },
        FileEntry { name: "0SnZHh2GT".into(), extension: ".png".into(), date: Date { year: 2006, month: 10, day: 18 }, size: 25890 },
    ];

    println!("Original:");
    print_files(&files);

    println!("Sorted by name:");
    sort_by_name(&mut files);
    print_files(&files);

    println!("Sorted by extension:");
    sort_by_extension(&mut files);
    print_files(&files);

    println!("Sorted by date:");
    sort_by_date(&mut files);
    print_files(&files);

    println!("Sorted by size:");
    sort_by_size(&mut files);
    print_files(&files);
}



/* Run:

Original:
G1zTo5jJk.jpg  2007-07-08  51954 bytes
LTEE4SI0j.jpg  2011-11-13  43442 bytes
PDqmuO3GH.cpp  2004-05-21  3346 bytes
qJO2qjukZ.png  2010-08-27  67087 bytes
HqclTqxb4.cpp  2020-09-05  70531 bytes
imVyTyoaF.jpg  2011-03-19  43846 bytes
rXwXdy8XO.txt  2017-10-12  70193 bytes
9Z4fbOBUc.pdf  2004-06-09  1754 bytes
ZHahuu4vS.txt  2003-10-10  65126 bytes
0SnZHh2GT.png  2006-10-18  25890 bytes

Sorted by name:
0SnZHh2GT.png  2006-10-18  25890 bytes
9Z4fbOBUc.pdf  2004-06-09  1754 bytes
G1zTo5jJk.jpg  2007-07-08  51954 bytes
HqclTqxb4.cpp  2020-09-05  70531 bytes
LTEE4SI0j.jpg  2011-11-13  43442 bytes
PDqmuO3GH.cpp  2004-05-21  3346 bytes
ZHahuu4vS.txt  2003-10-10  65126 bytes
imVyTyoaF.jpg  2011-03-19  43846 bytes
qJO2qjukZ.png  2010-08-27  67087 bytes
rXwXdy8XO.txt  2017-10-12  70193 bytes

Sorted by extension:
HqclTqxb4.cpp  2020-09-05  70531 bytes
PDqmuO3GH.cpp  2004-05-21  3346 bytes
G1zTo5jJk.jpg  2007-07-08  51954 bytes
LTEE4SI0j.jpg  2011-11-13  43442 bytes
imVyTyoaF.jpg  2011-03-19  43846 bytes
9Z4fbOBUc.pdf  2004-06-09  1754 bytes
0SnZHh2GT.png  2006-10-18  25890 bytes
qJO2qjukZ.png  2010-08-27  67087 bytes
ZHahuu4vS.txt  2003-10-10  65126 bytes
rXwXdy8XO.txt  2017-10-12  70193 bytes

Sorted by date:
ZHahuu4vS.txt  2003-10-10  65126 bytes
PDqmuO3GH.cpp  2004-05-21  3346 bytes
9Z4fbOBUc.pdf  2004-06-09  1754 bytes
0SnZHh2GT.png  2006-10-18  25890 bytes
G1zTo5jJk.jpg  2007-07-08  51954 bytes
qJO2qjukZ.png  2010-08-27  67087 bytes
imVyTyoaF.jpg  2011-03-19  43846 bytes
LTEE4SI0j.jpg  2011-11-13  43442 bytes
rXwXdy8XO.txt  2017-10-12  70193 bytes
HqclTqxb4.cpp  2020-09-05  70531 bytes

Sorted by size:
9Z4fbOBUc.pdf  2004-06-09  1754 bytes
PDqmuO3GH.cpp  2004-05-21  3346 bytes
0SnZHh2GT.png  2006-10-18  25890 bytes
LTEE4SI0j.jpg  2011-11-13  43442 bytes
imVyTyoaF.jpg  2011-03-19  43846 bytes
G1zTo5jJk.jpg  2007-07-08  51954 bytes
ZHahuu4vS.txt  2003-10-10  65126 bytes
qJO2qjukZ.png  2010-08-27  67087 bytes
rXwXdy8XO.txt  2017-10-12  70193 bytes
HqclTqxb4.cpp  2020-09-05  70531 bytes

*/

 



answered 16 hours ago by avibootz

Related questions

...