演習 - 反復子を実装する

完了

この演習では、次のように、ベクターでグループ化されたシーケンス内の等しい項目を返す反復子を実装します。

  • 入力:[ 1, 1, 2, 1, 3, 3 ]
  • 出力:

目標は、Group 構造体に対する Iterator 特性 (反復の合間に inner フィールドにデータの状態を保持する役割を果たす) の実装の記述を完了することです。

この割り当てを実行するには値を比較する必要があるため、ジェネリック型 TPartialEq 特性の実装元とする必要があります。 しかし、その部分は impl<T: PartialEq> セグメントで既に解決されているので、心配する必要はありません。

struct Groups<T> {
    inner: Vec<T>,
}

impl<T> Groups<T> {
    fn new(inner: Vec<T>) -> Self {
	    Groups { inner }
    }
}

impl<T: PartialEq> Iterator for Groups<T> {
    type Item = Vec<T>;

    // TODO: Write the rest of this implementation.
}

fn main() {
    let data = vec![4, 1, 1, 2, 1, 3, 3, -2, -2, -2, 5, 5];
    // groups:     |->|---->|->|->|--->|----------->|--->|
    assert_eq!(
	    Groups::new(data).into_iter().collect::<Vec<Vec<_>>>(),
	    vec![
	        vec![4],
    	    vec![1, 1],
	        vec![2],
    	    vec![1],
	        vec![3, 3],
	        vec![-2, -2, -2],
    	    vec![5, 5],
	    ]
    );

    let data2 = vec![1, 2, 2, 1, 1, 2, 2, 3, 4, 4, 3];
    // groups:      |->|---->|---->|----|->|----->|->|
    assert_eq!(
	    Groups::new(data2).into_iter().collect::<Vec<Vec<_>>>(),
	    vec![
	        vec![1],
    	    vec![2, 2],
	        vec![1, 1],
	        vec![2, 2],
    	    vec![3],
	        vec![4, 4],
	        vec![3],
	    ]
    )
}

この演習は、こちらの Rust Playground のリンクで表示することもできます。

この演習の解答については、こちらの Rust Playground のリンクをご覧ください。