1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58
use std::{ops::Deref, slice::Iter}; use crate::traits::{Collecting, HasDuplicate, ToIterator}; impl<T> Collecting<T> for Vec<T> { #[inline] fn collect(&mut self, item: T) { self.push(item); } } impl<'a, T: Clone> Collecting<&'a T> for Vec<T> where &'a T: Deref, { #[inline] fn collect(&mut self, item: &'a T) { self.push((*item).clone()); } } impl<'a, E> ToIterator<'a, Iter<'a, E>, &'a E> for Vec<E> { #[inline] fn to_iter(&'a self) -> Iter<'a, E> { self.iter() } } impl<T: std::cmp::Ord> HasDuplicate for Vec<T> { fn has_duplicate(&self) -> bool { let mut indices: Vec<usize> = (0..self.len()).into_iter().collect(); indices.sort_by_key(|index| &self[*index]); for (a, b) in indices.iter().zip(indices.iter().skip(1)) { if self[*a] == self[*b] { return true; } } false } } #[cfg(test)] mod tests { use crate::traits::HasDuplicate; #[test] fn test_has_duplciate() { let mut v = vec![6, 2, 3, 9, 1, 10, 23]; assert_eq!(v.has_duplicate(), false); v.push(3); assert_eq!(v.has_duplicate(), true); let v = vec!["hi", "ab", "cde", "abc"]; assert_eq!(v.has_duplicate(), false); let v = vec!["hi", "ab", "cde", "ab", "abc"]; assert_eq!(v.has_duplicate(), true); } }