在Rust中如何遍历两个不等长向量的所有姓名组合?
在Rust中生成两个不等长向量的所有名字姓氏组合
你可以通过两种常见方式生成所有名字与姓氏的笛卡尔积组合:
方式一:嵌套循环(直观易懂)
直接通过两层循环遍历所有名字和姓氏的组合,拼接后存入结果向量:
fn main() { let names = vec!["Marie", "Jana", "Eva", "Anna"]; let surnames = vec!["Novakova", "Svobodova", "Novotna", "Dvorakova", "Kralova"]; let mut gen_full_name = Vec::new(); for &name in &names { for &surname in &surnames { gen_full_name.push(format!("{} {}", name, surname)); } } // 验证结果(可选) for full_name in gen_full_name { println!("{}", full_name); } }
方式二:迭代器函数式写法(简洁符合Rust风格)
利用flat_map和map组合迭代器,将所有组合展平后收集为结果向量:
fn main() { let names = vec!["Marie", "Jana", "Eva", "Anna"]; let surnames = vec!["Novakova", "Svobodova", "Novotna", "Dvorakova", "Kralova"]; let gen_full_name: Vec<String> = names .iter() .flat_map(|&name| { surnames.iter().map(move |&surname| format!("{} {}", name, surname)) }) .collect(); // 验证结果(可选) for full_name in gen_full_name { println!("{}", full_name); } }
注意事项
- 拼接后的全名是
String类型,因此结果向量的类型为Vec<String>。如果需要&str类型,需保证字符串的生命周期满足需求,通常使用String是更稳妥的选择。 - 两种方式最终都会生成4×5=20个全名组合,覆盖所有可能的名字与姓氏配对。
内容的提问来源于stack exchange,提问作者Egor Likhacev
相关产品推荐
相关产品推荐

