Rust - 链式调用练习

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);
    
}

posted @ 2026-01-01 19:42  店里最会撒谎白玉汤  阅读(5)  评论(0)    收藏  举报