演習 - 反復子を実装する
この演習では、次のように、ベクターでグループ化されたシーケンス内の等しい項目を返す反復子を実装します。
- 入力:
[ 1, 1, 2, 1, 3, 3 ]
- 出力:
目標は、Group
構造体に対する Iterator
特性 (反復の合間に inner
フィールドにデータの状態を保持する役割を果たす) の実装の記述を完了することです。
この割り当てを実行するには値を比較する必要があるため、ジェネリック型 T
を PartialEq
特性の実装元とする必要があります。 しかし、その部分は 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 のリンクをご覧ください。