Ejercicio: Implementación de un iterador

Completado

En este ejercicio, implementará un iterador que devuelve los elementos iguales en una secuencia agrupada en vectores, como:

  • Entrada:[ 1, 1, 2, 1, 3, 3 ]
  • Salida:[ [1, 1], [2], [1], [3, 3] ]

El objetivo es terminar de escribir la implementación del rasgo Iterator de la estructura Group, que será responsable de mantener el estado de los datos entre iteraciones en su campo inner.

El tipo genérico T habrá de ser un implementador del rasgo PartialEq, ya que se tendrán que comparar los valores para realizar esta asignación. Pero no se preocupe, porque esa parte ya se ha resuelto en el segmento 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],
	    ]
    )
}

También puede ver este ejercicio en este vínculo al área de juegos de Rust.

Para encontrar una solución para este ejercicio, consulte este vínculo al área de juegos de Rust.