Counts and compresses consecutive elements that are equal. # Example ``` use rustml::vectors::*; let a = vec![1, 1, 2, 3, 3, 3, 3, 5, 5, 3]; assert_eq!( group(&a), vec![(1, 2), (2, 1), (3, 4), (5, 2), (3, 1)] ); ```
(v: &Vec<T>)
| 244 | /// ); |
| 245 | /// ``` |
| 246 | pub fn group<T: PartialEq + Clone>(v: &Vec<T>) -> Vec<(T, usize)> { |
| 247 | |
| 248 | let mut r: Vec<(T, usize)> = Vec::new(); |
| 249 | for val in v { |
| 250 | if r.len() == 0 { |
| 251 | r.push((val.clone(), 1)); |
| 252 | } else { |
| 253 | let mut x = r.pop().unwrap(); |
| 254 | if x.0 != *val { |
| 255 | r.push(x); |
| 256 | x = (val.clone(), 0); |
| 257 | } |
| 258 | x.1 += 1; |
| 259 | r.push(x); |
| 260 | } |
| 261 | } |
| 262 | r |
| 263 | } |
| 264 | |
| 265 | // ------------------------------------------------------------------ |
| 266 |