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