4
我有let myVec = vec![0..25]
,我想myVec
分成10組的迭代器:是否有可能使用迭代器將矢量分成10組?
[0,1,2,3,4,5,6,7,8,9]
[10,11,12,13,14,15,16,17,18,19]
[20,21,22,23,24,25,None,None,None,None]
是否有可能做到這一點與在鏽迭代器?
我有let myVec = vec![0..25]
,我想myVec
分成10組的迭代器:是否有可能使用迭代器將矢量分成10組?
[0,1,2,3,4,5,6,7,8,9]
[10,11,12,13,14,15,16,17,18,19]
[20,21,22,23,24,25,None,None,None,None]
是否有可能做到這一點與在鏽迭代器?
上有Iterator
trait直接沒有這樣的輔助方法。但是,有兩種主要的方式做到這一點:
使用[T]::chunks()
method(可在Vec<T>
直接調用)。然而,它有一個細微的差別:它不會產生None
,但最後一次迭代會產生一個更小的片。
let my_vec = (0..25).collect::<Vec<_>>();
for chunk in my_vec.chunks(10) {
println!("{:02?}", chunk);
}
結果:
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
[20, 21, 22, 23, 24]
使用從the crate itertools
的Itertools::chunks()
method。這個箱子擴展了標準庫中的Iterator
特性。所以這個chunks()
方法適用於所有迭代器!請注意,爲了成爲一般用戶,使用情況稍微複雜一些。這與上面描述的方法具有相同的行爲:在上一次迭代中,塊將更小,而不是包含None
。
extern crate itertools;
use itertools::Itertools;
for chunk in &(0..25).chunks(10) {
println!("{:02?}", chunk.collect::<Vec<_>>());
}
結果:
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
[20, 21, 22, 23, 24]
另外請注意:
vec![0..25]
沒有做你期望的事情!它將創建一個與一個元素的向量。該元素是Range
。我在上面的例子中解決了這個問題。snake_case
的名字。
謝謝!第一個解決方案正是我所期待的 – Teo