Rust 切片chunks - 一個區塊一個區塊取出數值
這篇[1]有提到windows
windows也會一次取出很多數值
但windows會重疊視窗
而有些時候不想要重疊視窗
可以使用chunks
chunks[2]
文件這樣解釋
pub fn chunks(&self, chunk_size: usize) -> Chunks<'_, T>
切片本身並且輸入chunk的大小
輸出為Chunks,為一個迭代器
迭代器裡面每個長度皆為chunk_size
如果最後數量不足chunk_size,則最後一個chunk不會等於chunk_size
文字可能不太容易懂
用圖來說明
假設我的chunk的大小選擇為2
則他會把每兩個數值選起來
第一個為1, 2,再來為3, 4,最後為5, 6
用程式來表示就會長這樣
fn main() {
let datas = vec![1, 2, 3, 4, 5, 6];
for data in datas.chunks(2) {
println!("{:?}", data);
}
}
[1, 2]
[3, 4]
[5, 6]
創立一個datas為1, 2, 3, 4, 5, 6
chunk設定為兩個
可看出輸出與預想中一樣
假設data數量有七個
一樣把兩個數據兩個數據框起來
但最後一組數字不足兩個,只會顯示7
程式表示會這樣
fn main() {
let datas = vec![1, 2, 3, 4, 5, 6, 7];
for data in datas.chunks(2) {
println!("{:?}", data);
}
}
[1, 2]
[3, 4]
[5, 6]
[7]
一樣兩個兩個一組
最後一個7不足兩個,會自己一組
例子
假設我有一串二進制的數字
希望將每四個每四個轉成10進制整數
例如 1010 0001 1100 1111
我要轉成 10 1 12 15
可以透過chunks和map[3]配合
fn main() {
let data = vec![1, 0, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1];
let res: Vec<_> = data
.chunks(4)
.map(|num| {
num[0] * 2_i32.pow(3)
+ num[1] * 2_i32.pow(2)
+ num[2] * 2_i32.pow(1)
+ num[3] * 2_i32.pow(0)
})
.collect();
println!("{:?}", res);
}
[10, 1, 12, 15]透過chunks先對每四個數字取樣
使用map處理這四個數字
蒐集到的數據是倒過來的
因此第一個數字要乘上2的3次方
第二個數字乘上2的平方
以此類推
最後蒐集起來輸出
跟預期一樣出現 10 1 12 15
參考資料
[1] https://lageeblog.blogspot.com/2023/11/rust-windows.html
[2] https://doc.rust-lang.org/std/primitive.slice.html#method.chunks
0 comments:
張貼留言