use std::collections::HashSet;
fn main() {
// 题目1:基本转换 有一个整数数组 [1, 2, 3, 4, 5],使用迭代器方法将每个元素加1,然后收集到一个新的Vec中
let arr1 = [1, 2, 3, 4, 5];
let result1: Vec<i32> = arr1.iter().map(|x| *x + 1).collect();
println!("{:?}", result1);
// 题目2:过滤和转换
// 有一个字符串数组 ["hello", "", "world", " ", "rust", ""],
// 过滤掉所有空字符串和只包含空格的字符串,然后将剩余的字符串转换为大写,最后收集到Vec中。
let arr2 = ["hello", "", "world", " ", "rust", ""];
let result2: Vec<String> = arr2.iter().filter(|&&s| !s.trim().is_empty()).map(|s| s.to_uppercase()).collect();
println!("{:?}", result2);
// 题目3:扁平化处理
// 有一个二维整数数组 vec![vec![1, 2], vec![3, 4, 5], vec![6]],使用flat_map将其扁平化为一维数组。
let arr3 = vec![vec![1, 2], vec![3, 4, 5], vec![6]];
let result3: Vec<i32> = arr3.iter().flat_map(|vec_| vec_.iter()).map(|x| *x).collect();
println!("{:?}", result3);
// 题目4:带索引的过滤
// 有一个整数数组 [10, 15, 20, 25, 30],
// 使用filter只保留大于15的元素,然后使用enumerate给每个元素标上索引,最后收集为Vec<(usize, i32)>。
let arr4 = [10, 15, 20, 25, 30];
let result4: Vec<(usize, i32)> = arr4.iter().filter(|&x| *x > 15).enumerate().map(|(idx, v)| (idx, *v)).collect();
println!("{:?}", result4);
// 题目5:合并数组
// 有两个数组:["Alice", "Bob", "Charlie"]和 [30, 25, 35],使用zip将它们合并成一个元组数组 [(名字, 年龄)]。
let arr5 = ["Alice", "Bob", "Charlie"];
let arr6 = [30, 25, 35];
let result5: Vec<(&str, i32)> = arr5.iter().zip(arr6.iter()).map(|(&name, &age)| (name, age)).collect();
println!("{:?}", result5);
// 题目6:切片选取
// 有一个整数数组 1..=10(包含1到10),使用take和skip取第4到第8个元素(包含两端)。
let item_4_8: Vec<i32> = (1..=10).skip(3).take(5).collect();
println!("{:?}", item_4_8);
// 题目7:类型转换
// 有一个整数数组 [1, 2, 3, 4, 5],使用map将每个整数转换为其字符串表示,然后收集成一个字符串数组。
let arr7 = [1, 2, 3, 4, 5];
let result7 = arr7.map(|x| x.to_string());
println!("{:?}", result7);
// 题目8:循环迭代
// 有一个数组 [1, 2, 3],使用cycle方法创建一个无限循环的迭代器,然后取前8个元素收集到Vec中
let arr8 = [1, 2, 3];
let result8: Vec<i32> = arr8.iter().cycle().take(8).cloned().collect();
println!("{:?}", result8);
// 题目9:条件转换
// 有一个整数数组 [1, 4, 9, 16, 25, 30],使用filter_map过滤出完全平方数(平方根为整数),并计算其平方根
let arr9 = [1, 4, 9, 16, 25, 30];
let result9: Vec<i32> = arr9.iter().filter_map(|&x| {
let v = (x as f64).sqrt() as i32;
if v * v == x {
Some(v)
}else{
None
}
}).collect();
println!("{:?}",result9);
// 题目10:连接和去重
// 有两个整数数组 [1, 2, 3, 4, 5]和 [4, 5, 6, 7, 8],
// 使用chain将它们连接起来,然后去除重复元素,最后排序(可以使用collect收集到Vec后再排序)。
let arr10 = [1, 2, 3, 4, 5];
let arr11 = [4, 5, 6, 7, 8];
let mut result: Vec<i32> = arr10.iter().chain(arr11.iter()).copied().collect::<HashSet<_>>().into_iter().collect();
result.sort();
println!("{:?}", result);
}