You now have a good understanding of iterators and closures and how they can be used to process collections of data.
In this challenge, you will use iterators to filter out duplicate items from a collection of potentially redundant entries.
Define a function that takes a collection of items (as an iterator) and returns a collection of unique items in sorted order. The items are represented as strings. You are expected to handle duplicates and ignore entries that are empty or consist solely of whitespace.
Your function signature and return types must be determined by you, but the input must implement the Iterator trait, ensuring flexibility for different iterator sources.
String, &String, or &str items.fn unique_items<I, T>(items: I) -> Vec<String>
where
I: Iterator<Item = T>,
T: AsRef<str>,
{
// Your code here
}HashSet to track unique items.filter_map method to remove invalid entries (e.g., empty or whitespace-only strings).trim method on strings to handle whitespace effectively.HashSet provides a method inesert that returns a bool indicating whether the item was already present.Vec and call the sort method.// 1. Finish the functionpub fn unique_items<T: AsRef<str>>(iter: impl Iterator<Item = T>) -> Vec<String> { let mut items: Vec<String> = iter .map(|x| x.as_ref().trim().to_string()) .filter(|x| !x.is_empty()) .collect(); items.sort(); items.dedup(); items}/// Example usagepub fn main() { let product_ids = vec![ "abc123".to_string(), " ".to_string(), "def456".to_string(), "abc123".to_string(), "ghi789".to_string(), "ghi789".to_string(), " def456".to_string(), ]; let unique_ids = unique_items(product_ids.into_iter()); assert_eq!(unique_ids, vec!["abc123", "def456", "ghi789"]);}// 1. Finish the function// pub fn unique_items ...pub fn unique_items<I, T>(items: I) -> Vec<String>where I: Iterator<Item = T>, T: AsRef<str>,{ // Your code here let mut unique_items: Vec<String> = items .map(|x| x.as_ref().to_string().trim().to_string()) .filter(|x| !x.is_empty()) .collect(); unique_items.sort(); unique_items.dedup(); unique_items}/// Example usagepub fn main() { let product_ids = vec![ "abc123".to_string(), " ".to_string(), "def456".to_string(), "abc123".to_string(), "ghi789".to_string(), "ghi789".to_string(), " def456".to_string(), ]; let unique_ids = unique_items(product_ids.into_iter()); assert_eq!(unique_ids, vec!["abc123", "def456", "ghi789"]);}// 1. Finish the function// pub fn unique_items ...pub fn unique_items<I, T>(iter: I) -> Vec<String>where I: Iterator<Item = T>, T: AsRef<str>{ let mut unique: Vec<String> = Vec::new(); for item in iter { let string = item.as_ref().trim().to_string(); if !string.is_empty() && !unique.contains(&string.to_string()) { unique.push(string.to_string()); } } unique.sort(); unique}/// Example usagepub fn main() { let product_ids = vec![ "abc123".to_string(), " ".to_string(), "def456".to_string(), "abc123".to_string(), "ghi789".to_string(), "ghi789".to_string(), " def456".to_string(), ]; let unique_ids = unique_items(product_ids.into_iter()); assert_eq!(unique_ids, vec!["abc123", "def456", "ghi789"]);}use std::collections::HashSet;// 1. Finish the functionpub fn unique_items<I, T>(items: I) -> Vec<String>where I: Iterator<Item = T>, T: AsRef<str>,{ let mut uniques = HashSet::new(); items .filter_map(|i| { let trimmed = i.as_ref().trim(); if trimmed.is_empty() { None } else { Some(trimmed.to_string()) } }) .for_each(|u| { uniques.insert(u); }); let mut vec: Vec<String> = uniques.into_iter().collect(); vec.sort(); vec}/// Example usagepub fn main() { let product_ids = vec![ "abc123".to_string(), " ".to_string(), "def456".to_string(), "abc123".to_string(), "ghi789".to_string(), "ghi789".to_string(), " def456".to_string(), ]; let unique_ids = unique_items(product_ids.into_iter()); assert_eq!(unique_ids, vec!["abc123", "def456", "ghi789"]);}// 1. Finish the function// pub fn unique_items ...use std::collections::HashSet;pub fn unique_items<T: AsRef<str>>(iter: impl Iterator<Item=T>) -> Vec<String> { let mut set:HashSet<String> = HashSet::new(); let mut res:Vec<String> = iter.filter_map(move |item| { let a = item.as_ref().trim(); if a == "" || set.contains(&a.to_string()) { return None } set.insert(a.to_string()); Some(a.to_string()) }).collect(); res.sort(); res}/// Example usagepub fn main() { let product_ids = vec![ "abc123".to_string(), " ".to_string(), "def456".to_string(), "abc123".to_string(), "ghi789".to_string(), "ghi789".to_string(), " def456".to_string(), ]; let unique_ids = unique_items(product_ids.into_iter()); assert_eq!(unique_ids, vec!["abc123", "def456", "ghi789"]);}use std::collections::HashSet;// 1. Finish the functionpub fn unique_items<I, T>(items: I) -> Vec<String>where I: Iterator<Item = T>, T: AsRef<str>,{ let uni: HashSet<String> = items .map(|s| s.as_ref().trim().to_string()) .filter(|s| !s.is_empty()) .collect(); let mut res: Vec<String> = uni.iter().cloned().collect(); res.sort(); res}/// Example usagepub fn main() { let product_ids = vec![ "abc123".to_string(), " ".to_string(), "def456".to_string(), "abc123".to_string(), "ghi789".to_string(), "ghi789".to_string(), " def456".to_string(), ]; let unique_ids = unique_items(product_ids.into_iter()); assert_eq!(unique_ids, vec!["abc123", "def456", "ghi789"]);}use std::collections::HashSet;// 1. Finish the function// pub fn unique_items ...pub fn unique_items<I, S>(items: I) -> Vec<String>where I: IntoIterator<Item = S>, S: AsRef<str>,{ let mut seen = HashSet::new(); let mut unique = Vec::new(); for item in items { let trimmed = item.as_ref().trim(); if !trimmed.is_empty() && seen.insert(trimmed.to_string()) { unique.push(trimmed.to_string()); } } unique.sort(); unique}/// Example usagepub fn main() { let product_ids = vec![ "abc123".to_string(), " ".to_string(), "def456".to_string(), "abc123".to_string(), "ghi789".to_string(), "ghi789".to_string(), " def456".to_string(), ]; let unique_ids = unique_items(product_ids.into_iter()); assert_eq!(unique_ids, vec!["abc123", "def456", "ghi789"]);}use std::collections::HashSet;// 1. Finish the functionpub fn unique_items<I, T> (iter: I )->Vec<String> where I: Iterator<Item = T>, T: AsRef<str>, { let unique_set: HashSet<_> = iter .map(|s| s.as_ref().trim().to_string()) .filter(|s| !s.is_empty()) .collect(); let mut retval: Vec<String> = unique_set.iter().cloned().collect(); retval.sort(); retval}// Example usagepub fn main() { let product_ids = vec![ "abc123".to_string(), " ".to_string(), "def456".to_string(), "abc123".to_string(), "ghi789".to_string(), "ghi789".to_string(), " def456".to_string(), ]; let unique_ids = unique_items(product_ids.into_iter()); assert_eq!(unique_ids, vec!["abc123", "def456", "ghi789"]);}// 1. Finish the functionpub fn unique_items<I, T>(items: I) -> Vec<String>where I: Iterator<Item = T>, T: AsRef<str>,{ let mut unique: Vec<String> = Vec::new(); for item in items { let s = item.as_ref().trim().to_string(); if !s.is_empty() && !unique.iter().any(|x| *x == s){ unique.push(s.to_string()) } } unique.sort(); unique}/// Example usagepub fn main() { let product_ids = vec![ "abc123".to_string(), " ".to_string(), "def456".to_string(), "abc123".to_string(), "ghi789".to_string(), "ghi789".to_string(), " def456".to_string(), ]; let unique_ids = unique_items(product_ids.into_iter()); assert_eq!(unique_ids, vec!["abc123", "def456", "ghi789"]);}use std::collections::HashSet;// 1. Finish the functionpub fn unique_items<I, T>(items: I) -> Vec<String>where I: Iterator<Item = T>, T: AsRef<str>,{ let set: HashSet<String> = items .filter_map(|item| { let s = item.as_ref().trim().to_string(); if s.is_empty() { return None; } Some(s) }) .collect(); let mut v: Vec<String> = set.into_iter().collect(); v.sort(); v}/// Example usagepub fn main() { let product_ids = vec![ "abc123".to_string(), " ".to_string(), "def456".to_string(), "abc123".to_string(), "ghi789".to_string(), "ghi789".to_string(), " def456".to_string(), ]; let unique_ids = unique_items(product_ids.into_iter()); assert_eq!(unique_ids, vec!["abc123", "def456", "ghi789"]);}use std::collections::BTreeSet;// 1. Finish the functionpub fn unique_items<T>(iter: impl Iterator<Item=T>) -> Vec<String> where T: AsRef<str> + Ord{ iter .map(|item| item.as_ref().trim().to_string()) .filter(|item| item.len() > 0) .collect::<BTreeSet<_>>() .into_iter() .collect::<Vec<_>>()}/// Example usagepub fn main() { let product_ids = vec![ "abc123".to_string(), " ".to_string(), "def456".to_string(), "abc123".to_string(), "ghi789".to_string(), "ghi789".to_string(), " def456".to_string(), ]; let unique_ids = unique_items(product_ids.into_iter()); assert_eq!(unique_ids, vec!["abc123", "def456", "ghi789"]);}use std::collections::HashSet;pub fn unique_items(items: impl Iterator<Item = impl AsRef<str>>) -> Vec<String>{ let mut set: HashSet<String> = HashSet::new(); for i in items { let s = i.as_ref().trim().to_string(); if s.is_empty() { continue; } set.insert(s); } let mut v = set.into_iter().collect::<Vec<String>>(); v.sort(); v}use std::collections::HashSet;pub fn unique_items<I, T>(items: I) -> Vec<String>where I: Iterator<Item = T>, T: AsRef<str>,{ let mut set: HashSet<String> = HashSet::new(); for i in items { let s = i.as_ref().trim().to_string(); if s.is_empty() { continue; } set.insert(s); } let mut v = set.into_iter().collect::<Vec<String>>(); v.sort(); v}use std::collections::BTreeSet;// 1. Finish the functionpub fn unique_items<I, T>(items: I) -> Vec<String>where I: Iterator<Item = T>, T: AsRef<str>,{ items.map(|a| a.as_ref().trim().to_string()) .filter(|a| !a.is_empty()) .collect::<BTreeSet<_>>() .into_iter() .collect()}/// Example usagepub fn main() { let product_ids = vec![ "abc123".to_string(), " ".to_string(), "def456".to_string(), "abc123".to_string(), "ghi789".to_string(), "ghi789".to_string(), " def456".to_string(), ]; let unique_ids = unique_items(product_ids.into_iter()); assert_eq!(unique_ids, vec!["abc123", "def456", "ghi789"]);}use std::collections::HashSet;pub fn unique_items<'a>(iter: impl Iterator<Item = impl AsRef<str>>) -> Vec<String> { let mut items = iter .map(|item| item.as_ref().trim().to_string()) .filter(|item| item.len() > 0) .collect::<HashSet<_>>() .into_iter() .collect::<Vec<_>>(); items.sort(); return items;}/// Example usagepub fn main() { let product_ids = vec![ "abc123".to_string(), " ".to_string(), "def456".to_string(), "abc123".to_string(), "ghi789".to_string(), "ghi789".to_string(), " def456".to_string(), ]; let unique_ids = unique_items(product_ids.into_iter()); assert_eq!(unique_ids, vec!["abc123", "def456", "ghi789"]);}use std::collections::HashSet;pub fn unique_items(items: impl Iterator<Item: AsRef<str>>) -> Vec<String> { let mut map = HashSet::new(); let mut filtered: Vec<_> = items .filter_map(|item| { let item = item.as_ref().trim().to_string(); if item.is_empty() || map.contains(&item) { return None; } map.insert(item.clone()); Some(item) }) .collect(); filtered.sort(); filtered}use std::{collections::HashSet,hash::Hash};// 1. Finish the functionpub fn unique_items<I,T>(items:I) -> Vec<String> where I:Iterator<Item=T>, T:AsRef<str>+Eq+Hash,{ let unique:HashSet<_> = items.collect(); let filtered:HashSet<String> = unique.into_iter().filter(|x| x.as_ref().trim().len()!=0).map(|y| y.as_ref().trim().to_string()).collect(); let mut vec_values:Vec<_> = filtered.into_iter().collect(); vec_values.sort(); vec_values}/// Example usagepub fn main() { let product_ids = vec![ "abc123".to_string(), " ".to_string(), "def456".to_string(), "abc123".to_string(), "ghi789".to_string(), "ghi789".to_string(), " def456".to_string(), ]; let unique_ids = unique_items(product_ids.into_iter()); assert_eq!(unique_ids, vec!["abc123", "def456", "ghi789"]);}use std::collections::HashSet;// 1. Finish the function// pub fn unique_items ...pub fn unique_items<I, T>(iter: I) -> Vec<String>where I: Iterator<Item = T>, T: AsRef<str>{ let result = iter.filter_map(|x| { let trimmed = x.as_ref().trim(); if !trimmed.is_empty() { Some(trimmed.to_string()) } else { None } }).collect::<HashSet<_>>(); let mut result = result.into_iter().collect::<Vec<_>>(); result.sort(); result}/// Example usagepub fn main() { let product_ids = vec![ "abc123".to_string(), " ".to_string(), "def456".to_string(), "abc123".to_string(), "ghi789".to_string(), "ghi789".to_string(), " def456".to_string(), ]; let unique_ids = unique_items(product_ids.into_iter()); assert_eq!(unique_ids, vec!["abc123", "def456", "ghi789"]);}use std::collections::HashSet;// 1. Finish the functionpub fn unique_items<I, T>(iter: I) -> Vec<String> where I: Iterator<Item = T>, T: AsRef<str> + ToString + std::cmp::Eq + std::hash::Hash,{ let mut unique_ids = HashSet::<String>::from_iter( iter.map(|item| item.as_ref().trim().to_string()) .filter(|item| !item.is_empty()) ).into_iter().collect::<Vec<String>>(); unique_ids.sort(); unique_ids}/// Example usagepub fn main() { let product_ids = vec![ "abc123".to_string(), " ".to_string(), "def456".to_string(), "abc123".to_string(), "ghi789".to_string(), "ghi789".to_string(), " def456".to_string(), ]; let unique_ids = unique_items(product_ids.into_iter()); assert_eq!(unique_ids, vec!["abc123", "def456", "ghi789"]);}// 1. Finish the function// pub fn unique_items ...pub fn unique_items<I, T>(items: I) -> Vec<String>where I: Iterator<Item = T>, T: AsRef<str>,{ // Your code here let mut vector: Vec<String> = Vec::new(); for item in items { let trimmed = item.as_ref().trim().to_string(); if !trimmed.is_empty() && !vector.iter().any(|x| *x == trimmed){ vector.push(trimmed.to_string()) } } vector.sort(); vector}/// Example usagepub fn main() { let product_ids = vec![ "abc123".to_string(), " ".to_string(), "def456".to_string(), "abc123".to_string(), "ghi789".to_string(), "ghi789".to_string(), " def456".to_string(), ]; let unique_ids = unique_items(product_ids.into_iter()); assert_eq!(unique_ids, vec!["abc123", "def456", "ghi789"]);}use std::collections::BTreeSet;pub fn _unique_items<T>(items: impl Iterator<Item = T>) -> Vec<String>where T: AsRef<str>,{ let mut set = BTreeSet::new(); items .filter_map(|id| { let id = id.as_ref().trim(); if id.is_empty() { None } else { Some(id.to_string()) } }) .for_each(|id| { set.insert(id); }); set.into_iter().collect()}pub fn unique_items<I, T>(items: I) -> Vec<String>where I: Iterator<Item = T>, T: AsRef<str>,{ let mut items = items .filter_map(|id| { let id = id.as_ref().trim(); if id.is_empty() { None } else { Some(id.to_string()) } }) .collect::<Vec<_>>(); items.sort(); items.dedup(); items}/// Example usagepub fn main() { let product_ids = vec![ "abc123".to_string(), " ".to_string(), "def456".to_string(), "abc123".to_string(), "ghi789".to_string(), "ghi789".to_string(), " def456".to_string(), ]; let unique_ids = unique_items(product_ids.into_iter()); assert_eq!(unique_ids, vec!["abc123", "def456", "ghi789"]);}use std::collections::BTreeSet;pub fn unique_items<T>(items: impl Iterator<Item = T>) -> Vec<String>where T: AsRef<str>,{ let mut set = BTreeSet::new(); items .filter_map(|id| { let id = id.as_ref().trim(); if id.is_empty() { None } else { Some(id.to_string()) } }) .for_each(|id| { set.insert(id); }); set.into_iter().collect()}/// Example usagepub fn main() { let product_ids = vec![ "abc123".to_string(), " ".to_string(), "def456".to_string(), "abc123".to_string(), "ghi789".to_string(), "ghi789".to_string(), " def456".to_string(), ]; let unique_ids = unique_items(product_ids.into_iter()); assert_eq!(unique_ids, vec!["abc123", "def456", "ghi789"]);}// 1. Finish the functionuse std::collections::HashSet;pub fn unique_items<I, T>(items: I) -> Vec<String>where I: Iterator<Item = T>, T: AsRef<str>,{ let mut presented = HashSet::new(); let mut a: Vec<String> = items .filter(|x| { let s = x.as_ref().trim(); !s.is_empty() && presented.insert(s.to_string()) // insert returns true if new element }) .map(|x| x.as_ref().trim().to_string()) .collect::<Vec<String>>(); a.sort(); a}/// Example usagepub fn main() { let product_ids = vec![ "abc123".to_string(), " ".to_string(), "def456".to_string(), "abc123".to_string(), "ghi789".to_string(), "ghi789".to_string(), " def456".to_string(), ]; let unique_ids = unique_items(product_ids.into_iter()); assert_eq!(unique_ids, vec!["abc123", "def456", "ghi789"]);}use std::collections::HashSet;// 1. Finish the function// pub fn unique_items ...pub fn unique_items<I, T>(items: I) -> Vec<String>where I: Iterator<Item = T>, T: AsRef<str>,{ let mut items = items .filter_map(|i| { let s = i.as_ref().trim(); (!s.is_empty()).then(|| s.to_string()) }) .collect::<HashSet<_>>() .into_iter() .collect::<Vec<String>>(); items.sort(); items}/// Example usagepub fn main() { let product_ids = vec![ "abc123".to_string(), " ".to_string(), "def456".to_string(), "abc123".to_string(), "ghi789".to_string(), "ghi789".to_string(), " def456".to_string(), ]; let unique_ids = unique_items(product_ids.into_iter()); assert_eq!(unique_ids, vec!["abc123", "def456", "ghi789"]);}use std::collections::HashSet;// 1. Finish the function// pub fn unique_items ...pub fn unique_items<I,T>(items: I) -> Vec<String>where I: Iterator<Item = T>, T : AsRef<str>{ let mut items_store = HashSet::new(); for item in items{ let item_str = item.as_ref().trim(); if !item_str.is_empty(){ items_store.insert(item_str.to_string()); } } let mut unique_ids:Vec<String> = items_store.into_iter().collect(); unique_ids.sort(); unique_ids}/// Example usagepub fn main() { let product_ids = vec![ "abc123".to_string(), " ".to_string(), "def456".to_string(), "abc123".to_string(), "ghi789".to_string(), "ghi789".to_string(), " def456".to_string(), ]; let unique_ids = unique_items(product_ids.into_iter()); assert_eq!(unique_ids, vec!["abc123", "def456", "ghi789"]);}// 1. Finish the function// pub fn unique_items ...use std::collections::HashMap;pub fn unique_items<T: AsRef<str>>(items: impl Iterator<Item = T>) -> Vec<String> { let non_empty = items .filter_map(|x| { let trimmed = x.as_ref().trim(); if trimmed.is_empty() { None } else { Some(trimmed.to_string()) } }) .collect::<Vec<String>>(); let mut set = std::collections::HashSet::new(); for item in non_empty { set.insert(item); } let mut unique = set.into_iter().collect::<Vec<String>>(); unique.sort(); unique}/// Example usagepub fn main() { let product_ids = vec![ "abc123".to_string(), " ".to_string(), "def456".to_string(), "abc123".to_string(), "ghi789".to_string(), "ghi789".to_string(), " def456".to_string(), ]; let unique_ids = unique_items(product_ids.into_iter()); assert_eq!(unique_ids, vec!["abc123", "def456", "ghi789"]);}// 1. Finish the function// pub fn unique_items ...pub fn unique_items<I, T>(items: I) -> Vec<String>where I: Iterator<Item = T>, T: AsRef<str>,{ let items = items.filter_map(|id| { let trimmed = id.as_ref().trim(); if trimmed.is_empty() { None } else { Some(trimmed.to_string()) } }); let mut unique = std::collections::HashSet::new(); for id in items { unique.insert(id); } let mut result = unique.iter().map(|id| id.to_string()).collect::<Vec<String>>(); result.sort(); result}/// Example usagepub fn main() { let product_ids = vec![ "abc123".to_string(), " ".to_string(), "def456".to_string(), "abc123".to_string(), "ghi789".to_string(), "ghi789".to_string(), " def456".to_string(), ]; let unique_ids = unique_items(product_ids.into_iter()); assert_eq!(unique_ids, vec!["abc123", "def456", "ghi789"]);}use std::collections::HashSet;// 1. Finish the function// pub fn unique_items ...pub fn unique_items<I, T>(items: I) -> Vec<String>whereI: Iterator<Item = T>,T: AsRef<str>,{ let mut set = HashSet::new(); let mut v: Vec<String> = items .filter_map(|x| { let trimmed = x.as_ref().trim(); if !trimmed.is_empty() && set.insert(trimmed.to_string()) { Some(trimmed.into()) } else { None } }) .collect(); v.sort(); v}/// Example usagepub fn main() { let product_ids = vec![ "abc123".to_string(), " ".to_string(), "def456".to_string(), "abc123".to_string(), "ghi789".to_string(), "ghi789".to_string(), " def456".to_string(), ]; let unique_ids = unique_items(product_ids.into_iter()); assert_eq!(unique_ids, vec!["abc123", "def456", "ghi789"]);}use std::collections::HashSet;pub fn unique_items<I, T>(items: I) -> Vec<String>where I: Iterator<Item = T>, T: AsRef<str>,{ let mut set = HashSet::new(); let mut v: Vec<String> = items .filter_map(|x| { let trimmed = x.as_ref().trim(); if !trimmed.is_empty() && set.insert(trimmed.to_string()) { Some(trimmed.into()) } else { None } }) .collect(); v.sort(); v}/// Example usagepub fn main() { let product_ids = vec![ "abc123".to_string(), " ".to_string(), "def456".to_string(), "abc123".to_string(), "ghi789".to_string(), "ghi789".to_string(), " def456".to_string(), ]; let unique_ids = unique_items(product_ids.into_iter()); assert_eq!(unique_ids, vec!["abc123", "def456", "ghi789"]);}use std::collections::HashSet;pub fn unique_items<I, T>(items: I) -> Vec<String>where I: Iterator<Item = T>, T: AsRef<str>,{ let mut set = HashSet::new(); let mut v: Vec<String> = items .filter_map(|x| { let trimmed = x.as_ref().trim(); if !trimmed.is_empty() && set.insert(trimmed.to_string()) { Some(trimmed.into()) } else { None } }) .collect(); v.sort(); v}/// Example usagepub fn main() { let product_ids = vec![ "abc123".to_string(), " ".to_string(), "def456".to_string(), "abc123".to_string(), "ghi789".to_string(), "ghi789".to_string(), " def456".to_string(), ]; let unique_ids = unique_items(product_ids.into_iter()); assert_eq!(unique_ids, vec!["abc123", "def456", "ghi789"]);}use std::collections::HashSet;// 1. Finish the functionpub fn unique_items<I, T>(product: I) -> Vec<String>where I: Iterator<Item = T>, T: AsRef<str>,{ let mut set = HashSet::new(); let mut new_vec: Vec<String> = product .filter_map(|p| { let trimmed = p.as_ref().trim(); if !trimmed.is_empty() && set.insert(trimmed.to_string()) { Some(trimmed.to_string()) } else { None } }) .collect(); new_vec.sort(); new_vec}/// Example usagepub fn main() { let product_ids = vec![ "abc123".to_string(), " ".to_string(), "def456".to_string(), "abc123".to_string(), "ghi789".to_string(), "ghi789".to_string(), " def456".to_string(), ]; let unique_ids = unique_items(product_ids.into_iter()); assert_eq!(unique_ids, vec!["abc123", "def456", "ghi789"]);}use std::collections::HashSet;pub fn unique_items<I>(iter: I) -> Vec<String> where I: Iterator, I::Item: AsRef<str>,{ let mut seen = HashSet::new(); let mut item: Vec<String> = iter .map(|x| x.as_ref().trim().to_string()) .filter_map(|x| seen.insert(x.clone()).then(|| x)) .filter(|x| x.len() != 0) .collect(); item.sort(); item}/// Example usagepub fn main() { let product_ids = vec![ "abc123".to_string(), " ".to_string(), "def456".to_string(), "abc123".to_string(), "ghi789".to_string(), "ghi789".to_string(), " def456".to_string(), ]; let unique_ids = unique_items(product_ids.into_iter()); assert_eq!(unique_ids, vec!["abc123", "def456", "ghi789"]);}use std::collections::HashSet;pub fn unique_items<I, T>(items: I) -> Vec<String>where I: Iterator<Item = T>, T: AsRef<str>,{ let mut unique_items = HashSet::new(); let mut result: Vec<String> = items.filter_map(|item| { let item = item.as_ref().trim().to_string(); if !item.is_empty() && unique_items.insert(item.clone()) { Some(item) } else { None } }) .collect::<Vec<String>>(); result.sort(); result}/// Example usagepub fn main() { let product_ids = vec![ "abc123".to_string(), " ".to_string(), "def456".to_string(), "abc123".to_string(), "ghi789".to_string(), "ghi789".to_string(), " def456".to_string(), ]; let unique_ids = unique_items(product_ids.into_iter()); assert_eq!(unique_ids, vec!["abc123", "def456", "ghi789"]);}// 1. Finish the function// pub fn unique_items ...pub fn unique_items<I, T>(iter: I) -> Vec<String> where I: Iterator<Item = T>, T: AsRef<str>, { let mut res = Vec::new(); let mut map = std::collections::hash_set::HashSet::new(); for i in iter { let current = i.as_ref().trim(); let inserted = map.insert(current.to_string()); if inserted && current != "" { res.push(current.to_string()); } } res.sort(); res}/// Example usagepub fn main() { let product_ids = vec![ "abc123".to_string(), " ".to_string(), "def456".to_string(), "abc123".to_string(), "ghi789".to_string(), "ghi789".to_string(), " def456".to_string(), ]; let unique_ids = unique_items(product_ids.into_iter()); assert_eq!(unique_ids, vec!["abc123", "def456", "ghi789"]);}// 1. Finish the function// pub fn unique_items ...pub fn unique_items<I, T>(iter: I) -> Vec<String> where I: Iterator<Item = T>, T: AsRef<str> + PartialEq + std::cmp::PartialEq, { let mut res = Vec::new(); for el in iter { let s = el.as_ref().trim(); if !s.is_empty() && !res.contains(&s.to_string()) { res.push(s.to_string()); } } res.sort(); res}/// Example usagepub fn main() { let product_ids = vec![ "abc123".to_string(), " ".to_string(), "def456".to_string(), "abc123".to_string(), "ghi789".to_string(), "ghi789".to_string(), " def456".to_string(), ]; let unique_ids = unique_items(product_ids.into_iter()); assert_eq!(unique_ids, vec!["abc123", "def456", "ghi789"]);}use std::collections::HashSet;pub fn unique_items<I, T>(iter: I) -> Vec<String>where I: Iterator<Item = T>, T: AsRef<str>,{ let mut seen = HashSet::new(); let mut v: Vec<String> = iter.filter_map(|s| { let trimmed = s.as_ref().trim(); if !trimmed.is_empty() && seen.insert(trimmed.to_string()) { Some(trimmed.to_string()) } else { None } }) .collect(); v.sort(); v}/// Example usagepub fn main() { let product_ids = vec![ "abc123".to_string(), " ".to_string(), "def456".to_string(), "abc123".to_string(), "ghi789".to_string(), "ghi789".to_string(), " def456".to_string(), ]; let unique_ids = unique_items(product_ids.into_iter()); assert_eq!(unique_ids, vec!["abc123", "def456", "ghi789"]);}use std::collections::HashSet;// 1. Finish the functionpub fn unique_items<I, T>(items: I) -> Vec<String> whereI: Iterator<Item = T>,T: AsRef<str> + std::cmp::Eq + std::hash::Hash,{ let mut h = HashSet::new(); let mut v = items .filter_map(|x| { let s = x.as_ref().trim().to_string(); if !s.is_empty() && h.insert(s.clone()) { Some(s) } else { None } }) .collect::<Vec<String>>(); v.sort(); v}/// Example usagepub fn main() { let product_ids = vec![ "abc123".to_string(), " ".to_string(), "def456".to_string(), "abc123".to_string(), "ghi789".to_string(), "ghi789".to_string(), " def456".to_string(), ]; let unique_ids = unique_items(product_ids.into_iter()); assert_eq!(unique_ids, vec!["abc123", "def456", "ghi789"]);}// 1. Finish the functionpub fn unique_items<I,T> (items:I)->Vec<String> where I:Iterator<Item=T>, T:AsRef<str>, { let mut hashset=HashSet::new(); let mut vec_string:Vec<String> = items.filter_map(|item| {let trimmed = item.as_ref().trim(); if trimmed.is_empty(){ None } else{ Some(trimmed.to_string()) } }).filter(move|value| hashset.insert(value.clone())) .collect(); vec_string.sort(); vec_string } use std::collections::HashSet;/// Example usagepub fn main() { let product_ids = vec![ "abc123".to_string(), " ".to_string(), "def456".to_string(), "abc123".to_string(), "ghi789".to_string(), "ghi789".to_string(), " def456".to_string(), ]; let unique_ids = unique_items(product_ids.into_iter()); assert_eq!(unique_ids, vec!["abc123", "def456", "ghi789"]);}// 1. Finish the functionpub fn unique_items<I,T> (items:I)->Vec<String> where I:Iterator<Item=T>, T:AsRef<str>, { let mut hashset=HashSet::new(); let mut vec_string:Vec<String> = items.filter_map(|item| {let trimmed = item.as_ref().trim(); if trimmed.is_empty(){ None } else{ Some(trimmed.to_string()) } }).filter(move|value| hashset.insert(value.clone())) .collect(); vec_string.sort(); vec_string } use std::collections::HashSet;/// Example usagepub fn main() { let product_ids = vec![ "abc123".to_string(), " ".to_string(), "def456".to_string(), "abc123".to_string(), "ghi789".to_string(), "ghi789".to_string(), " def456".to_string(), ]; let unique_ids = unique_items(product_ids.into_iter()); assert_eq!(unique_ids, vec!["abc123", "def456", "ghi789"]);}// 1. Finish the functionuse std::collections::HashSet;// pub fn unique_items ...pub fn unique_items<T>(it: impl Iterator<Item=T>) -> Vec<String>where T: AsRef<str> + std::cmp::Eq + std::hash::Hash{ let mut set = HashSet::new(); for e in it { let v = e.as_ref().trim(); if !v.is_empty() { set.insert(v.to_string()); } } let mut res: Vec<_> = set.into_iter().collect(); res.sort(); res}/// Example usagepub fn main() { let product_ids = vec![ "abc123".to_string(), " ".to_string(), "def456".to_string(), "abc123".to_string(), "ghi789".to_string(), "ghi789".to_string(), " def456".to_string(), ]; let unique_ids = unique_items(product_ids.into_iter()); assert_eq!(unique_ids, vec!["abc123", "def456", "ghi789"]);}use std::collections::HashSet;// 1. Finish the function// pub fn unique_items ...pub fn unique_items<I,T>(items: I) -> Vec<String>where I : Iterator<Item = T>, T: AsRef<str> + std::cmp::Eq + std::hash::Hash,{ let mut hash = HashSet::new(); let mut res = vec![]; for i in items{ let i = i.as_ref().trim(); if !i.is_empty(){ hash.insert(i.to_string()); } } res = hash.into_iter().collect(); res.sort(); res}/// Example usagepub fn main() { let product_ids = vec![ "abc123".to_string(), " ".to_string(), "def456".to_string(), "abc123".to_string(), "ghi789".to_string(), "ghi789".to_string(), " def456".to_string(), ]; let unique_ids = unique_items(product_ids.into_iter()); assert_eq!(unique_ids, vec!["abc123", "def456", "ghi789"]);}// 1. Finish the functionpub fn unique_items<I, S>(items: I) -> Vec<String>where I: IntoIterator<Item = S>, S: AsRef<str>,{ let mut data: Vec<String> = items .into_iter() .filter_map(|item| { let item = item.as_ref().trim(); if item.is_empty() { None } else { Some(item.to_string()) } }) // .filter(|item| !item.as_ref().trim().is_empty()) // .map(|s| s.as_ref().trim().to_string()) .collect(); data.sort(); data.dedup(); data}/// Example usagepub fn main() { let product_ids = vec![ "abc123".to_string(), " ".to_string(), "def456".to_string(), "abc123".to_string(), "ghi789".to_string(), "ghi789".to_string(), " def456".to_string(), ]; let unique_ids = unique_items(product_ids.into_iter()); assert_eq!(unique_ids, vec!["abc123", "def456", "ghi789"]);}// 1. Finish the functionpub fn unique_items<I, S>(items: I) -> Vec<String>where I: IntoIterator<Item = S>, S: AsRef<str>,{ let mut data: Vec<String> = items .into_iter() .filter_map(|item| { let item = item.as_ref().trim(); if item.is_empty() { None } else { Some(item.to_string()) } }) // .filter(|item| !item.as_ref().trim().is_empty()) // .map(|s| s.as_ref().trim().to_string()) .collect(); data.sort(); data.dedup(); data}/// Example usagepub fn main() { let product_ids = vec![ "abc123".to_string(), " ".to_string(), "def456".to_string(), "abc123".to_string(), "ghi789".to_string(), "ghi789".to_string(), " def456".to_string(), ]; let unique_ids = unique_items(product_ids.into_iter()); assert_eq!(unique_ids, vec!["abc123", "def456", "ghi789"]);}use std::collections::HashSet;// 1. Finish the functionpub fn unique_items<T>(items: impl Iterator<Item = T>) -> Vec<String> where T: AsRef<str>,{ // THE LONG WAY let mut hs = HashSet::new(); for elem in items { let x = elem.as_ref().trim(); let test = x.is_empty(); if test == false { hs.insert(x.to_string()); } } let mut unique: Vec<String> = hs.into_iter().collect(); unique.sort(); unique // // A SHORTER WAY ?? // let unique = items // .map(|item| item.as_ref().trim().to_string()) // .filter(|item| !item.is_empty()) // .collect::<HashSet<String>>(); // let mut unique = unique.into_iter().collect::<Vec<String>>(); // unique.sort(); // unique }/// Example usagepub fn main() { let product_ids = vec![ "abc123".to_string(), " ".to_string(), "def456".to_string(), "abc123".to_string(), "ghi789".to_string(), "ghi789".to_string(), " def456".to_string(), ]; let unique_ids = unique_items(product_ids.into_iter()); assert_eq!(unique_ids, vec!["abc123", "def456", "ghi789"]);}// 1. Finish the function// pub fn unique_items ...pub fn unique_items<T>(items: impl Iterator<Item = T>) -> Vec<String>where T: AsRef<str>,{ let mut res = Vec::<String>::new(); for item in items { let item = item.as_ref(); let item = item.trim(); if item.is_empty() { continue; } let item = item.to_string(); if !res.contains(&item) { res.push(item); } } res.sort(); res}/// Example usagepub fn main() { let product_ids = vec![ "abc123".to_string(), " ".to_string(), "def456".to_string(), "abc123".to_string(), "ghi789".to_string(), "ghi789".to_string(), " def456".to_string(), ]; let unique_ids = unique_items(product_ids.into_iter()); assert_eq!(unique_ids, vec!["abc123", "def456", "ghi789"]);}use std::collections::HashSet;use std::hash::Hash;pub fn unique_items<I, T>(iter: I) -> Vec<String>where I: Iterator<Item = T>, T: AsRef<str> + Eq + Hash,{ let unique = iter .map(|item| item.as_ref().trim().to_string()) .filter(|item| !item.is_empty()) .collect::<HashSet<String>>(); let mut unique = unique.into_iter().collect::<Vec<String>>(); unique.sort(); unique}/// Example usagepub fn main() { let product_ids = vec![ "abc123".to_string(), " ".to_string(), "def456".to_string(), "abc123".to_string(), "ghi789".to_string(), "ghi789".to_string(), " def456".to_string(), ]; let unique_ids = unique_items(product_ids.into_iter()); assert_eq!(unique_ids, vec!["abc123", "def456", "ghi789"]);}use std::collections::HashSet;// 1. Finish the function// pub fn unique_items ...pub fn unique_items<I,T>(iter:I ) ->Vec<String>where I : Iterator<Item=T>, T : AsRef<str> { let unique_set:HashSet<String> = iter .filter_map(|s| {let s=s.as_ref().trim().to_string(); if s.is_empty(){return None;} else {return Some(s);}} ) .collect(); let mut res:Vec<String> = unique_set.into_iter().collect(); res.sort(); res}/// Example usagepub fn main() { let product_ids = vec![ "abc123".to_string(), " ".to_string(), "def456".to_string(), "abc123".to_string(), "ghi789".to_string(), "ghi789".to_string(), " def456".to_string(), ]; let unique_ids = unique_items(product_ids.into_iter()); assert_eq!(unique_ids, vec!["abc123", "def456", "ghi789"]);}use std::ops::Not;// 1. Finish the function// pub fn unique_items ...pub fn unique_items<Iter, T>(items: Iter) -> Vec<String>where Iter: Iterator<Item = T>, T: AsRef<str>,{ let mut vec = items .filter_map(|item| item.as_ref().trim().is_empty().not().then(|| item.as_ref().trim().to_owned())) .collect::<Vec<_>>(); vec.sort(); vec.dedup(); vec}/// Example usagepub fn main() { let product_ids = vec![ "abc123".to_string(), " ".to_string(), "def456".to_string(), "abc123".to_string(), "ghi789".to_string(), "ghi789".to_string(), " def456".to_string(), ]; let unique_ids = unique_items(product_ids.into_iter()); assert_eq!(unique_ids, vec!["abc123", "def456", "ghi789"]);}// 1. Finish the function// pub fn unique_items ...pub fn unique_items<I, T>(iter: I) -> Vec<String>where I: Iterator<Item = T>, T: AsRef<str>,{ let mut set = iter.filter_map(|s| { let trimed = s.as_ref().trim(); if trimed.is_empty() { None } else { Some(trimed.to_string()) } }).collect::<Vec<String>>(); set.sort(); set.dedup(); set}/// Example usagepub fn main() { let product_ids = vec![ "abc123".to_string(), " ".to_string(), "def456".to_string(), "abc123".to_string(), "ghi789".to_string(), "ghi789".to_string(), " def456".to_string(), ]; let unique_ids = unique_items(product_ids.into_iter()); assert_eq!(unique_ids, vec!["abc123", "def456", "ghi789"]);}use std::collections::HashSet;use std::hash::Hash;// 1. Finish the function// pub fn unique_items ...pub fn unique_items<I, T>(items: I) -> Vec<String>where I: Iterator<Item = T>, T: AsRef<str>{ let unique_items = items .map(|item| item.as_ref().trim().to_string()) .filter(|item| !item.is_empty()) .collect::<HashSet<String>>(); let mut unique = unique_items.into_iter().collect::<Vec<String>>(); unique.sort(); unique}/// Example usagepub fn main() { let product_ids = vec![ "abc123".to_string(), " ".to_string(), "def456".to_string(), "abc123".to_string(), "ghi789".to_string(), "ghi789".to_string(), " def456".to_string(), ]; let unique_ids = unique_items(product_ids.into_iter()); assert_eq!(unique_ids, vec!["abc123", "def456", "ghi789"]);}