↑Programmieren in Rust
Vorgelegt werden soll ein Programm das folgendes tut:
use std::collections::HashMap; fn string_to_words(s: &str) -> Vec<String> { let mut acc: Vec<String> = Vec::new(); let mut buffer = String::new(); for c in s.chars() { if c.is_alphabetic() { buffer.push(c); } else { if !buffer.is_empty() { acc.push(buffer.clone()); buffer.clear(); } } } acc } fn unique(v: &[String]) -> Vec<String> { let mut m: HashMap<String, ()> = HashMap::new(); for s in v { m.insert(s.clone(), ()); } let mut acc: Vec<String> = Vec::new(); for (key, _) in m { acc.push(key); } acc } fn main() { let args: Vec<String> = std::env::args().collect(); let path = &args[1]; let s = match std::fs::read_to_string(path) { Ok(s) => s, _ => { println!("Could not read file {}.", path); return; } }; let mut words = string_to_words(&s); words = unique(&words); words.sort(); println!("{:?}", words); }
use std::collections::HashSet; use std::iter::FromIterator; use std::hash::Hash; fn string_to_words(s: &str) -> impl Iterator<Item = &str> + '_ { s.split(|x: char| !x.is_alphabetic()).filter(|&x| x != "") } fn unique<T: Eq + Hash>(i: impl IntoIterator<Item = T>) -> Vec<T> { HashSet::<T>::from_iter(i.into_iter()).into_iter().collect() } fn main() { let argv: Vec<String> = std::env::args().collect(); let path = &argv[1]; let s = match std::fs::read_to_string(path) { Ok(s) => s, _ => { println!("Could not read file {}.", path); return; } }; let mut words = unique(string_to_words(&s)); words.sort(); println!("{:?}", words); }