Rust 數組Vec應用 - 對兩個或以上結構排序
兩個或以上結構排序
最近在找資料的時候
看到這篇覺得蠻有趣的
rust - How to sort a Vec of structs by 2 or multiple fields? - Stack Overflow[1]
作者希望同時依照row和column排列
排序通常用sort
但如果有多個結構想要排序
sort可能就不太夠用
例如我的整個數組有row和column
希望row排完之後
如果數字一樣要繼續排column
用一個程式比較一下
use std::collections::HashMap;
#[derive(Debug)]
struct Data {
row: u8,
col: u8,
}
fn main() {
let mut datas = vec![
Data{row: 10, col: 3},
Data{row: 30, col: 1},
Data{row: 20, col: 2},
Data{row: 20, col: 1},
Data{row: 10, col: 2},
Data{row: 30, col: 3},
Data{row: 30, col: 2},
Data{row: 20, col: 3},
Data{row: 10, col: 1},
];
datas.sort_by_key(|x| x.row);
print_data(&datas);
}fn print_data(datas: &Vec<Data>) {
for data in datas {
println!("row: {}, col: {}", data.row, data.col);
}
}
data裡面有九筆資料
希望row排完之後排col的數字
sort_by_key[2]為輸入參數
會根據參數排序
而修改
datas.sort_by_key(|x| x.row);
print_data(&datas);
可以有不同的結果
以下分四個部分
x.row
datas.sort_by_key(|x| x.row);
print_data(&datas);
row: 10, col: 3
row: 10, col: 2
row: 10, col: 1
row: 20, col: 2
row: 20, col: 1
row: 20, col: 3
row: 30, col: 1
row: 30, col: 3
row: 30, col: 2
根據row由小排到大,但col不理會
x.col
datas.sort_by_key(|x| x.col);
print_data(&datas);
row: 30, col: 1
row: 20, col: 1
row: 10, col: 1
row: 20, col: 2
row: 10, col: 2
row: 30, col: 2
row: 10, col: 3
row: 30, col: 3
row: 20, col: 3
變成先排col再排row
col會由小到大
row則是不會理會
但如果想要排好row之後要接著排col呢
(x.row x.col)
datas.sort_by_key(|x| (x.row, x.col));
print_data(&datas);
row: 10, col: 1
row: 10, col: 2
row: 10, col: 3
row: 20, col: 1
row: 20, col: 2
row: 20, col: 3
row: 30, col: 1
row: 30, col: 2
row: 30, col: 3
(x.row, x.col)會先把row排完,排完之後會排col
如果想先排col再排row
(x.col, x.row)
datas.sort_by_key(|x| (x.col, x.row));
print_data(&datas);
row: 10, col: 1
row: 20, col: 1
row: 30, col: 1
row: 10, col: 2
row: 20, col: 2
row: 30, col: 2
row: 10, col: 3
row: 20, col: 3
row: 30, col: 3
(x.col, x.row)則是相反,先排完col再排row
參考資料
[1] https://stackoverflow.com/questions/70193935/how-to-sort-a-vec-of-structs-by-2-or-multiple-fields
[2] https://doc.rust-lang.org/std/primitive.slice.html#method.sort_by_key
0 comments:
張貼留言