web-dev-qa-db-ja.com

イテレータを使用してベクトルを10のグループに分割することは可能ですか?

let my_vec = (0..25).collect::<Vec<_>>()があり、my_vecを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, None, None, None, None, None];

Rustのイテレータでそれを行うことは可能ですか?

13
Teo

Iterator trait に直接そのようなヘルパーメソッドはありません。ただし、これを行うには主に2つの方法があります。

  1. [T]::chunks()メソッド (_Vec<T>_で直接呼び出すことができます)を使用します。ただし、わずかな違いがあります。Noneは生成されませんが、最後の反復ではより小さなスライスが生成されます。

    _let my_vec = (0..25).collect::<Vec<_>>();
    
    for chunk in my_vec.chunks(10) {
        println!("{:02?}", chunk);
    }
    _

    結果:

    _[00, 01, 02, 03, 04, 05, 06, 07, 08, 09]
    [10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
    [20, 21, 22, 23, 24]
    _
  2. Itertools::chunks()メソッド from crate itertools を使用します=。このクレートは、標準ライブラリのIterator特性を拡張します。したがって、このchunks()メソッドはすべてのイテレータで機能します!その一般的なものにするために、使用法は少し複雑であることに注意してください。これは、上記の方法と同じ動作をします。最後の反復では、チャンクはNonesを含む代わりに小さくなります。

    _extern crate itertools;
    use itertools::Itertools;
    
    for chunk in &(0..25).chunks(10) {
        println!("{:02?}", chunk.collect::<Vec<_>>());
    }
    _

    結果:

    _[00, 01, 02, 03, 04, 05, 06, 07, 08, 09]
    [10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
    [20, 21, 22, 23, 24]
    _

また、次の点にも注意してください。

  • あなたのコードでは、_vec![0..25]_はあなたが期待することをしていません! one要素を持つベクトルを作成します。その要素は Range です。上記の例でこれを修正しました。
  • Rustでは、変数には_snake_case_の名前が付いています。
14