隱私權政策

搜尋此網誌

技術提供:Blogger.

關於我自己

我的相片
目前從事軟體相關行業,喜歡閱讀、健身、喝調酒。習慣把遇到的問題記下來,每天做一些整理方便自己以後查。 Python、Rust、Kotlin等程式語言皆為自學,目前比較著重在Rust語言,歡迎一起討論。

2023年12月22日 星期五

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:

張貼留言