MST
星途 面试题库

面试题:Rust迭代器适配器在复杂数据转换中的应用

给定一个包含字符串的`Vec<String>`,每个字符串代表一个浮点数。请使用Rust的迭代器适配器将这些字符串转换为对应的浮点数,过滤掉无效的转换结果(例如非数字字符串),然后计算这些有效浮点数的平均值。写出完整的Rust代码,并说明你选择的迭代器适配器如何协同工作以完成该任务。
21.3万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试
fn main() {
    let string_vec: Vec<String> = vec![
        "1.5".to_string(),
        "2.0".to_string(),
        "not_a_number".to_string(),
        "3.5".to_string(),
    ];

    let average = string_vec
      .iter()
      .filter_map(|s| s.parse::<f64>().ok())
      .fold((0.0, 0), |(sum, count), num| (sum + num, count + 1))
      .map(|(sum, count)| if count > 0 { sum / count as f64 } else { 0.0 });

    println!("Average: {}", average);
}

迭代器适配器协同工作说明

  1. .iter(): 将Vec<String>转换为迭代器,以便后续使用各种迭代器适配器方法。
  2. .filter_map():
    • filter: 过滤掉无效的转换结果。
    • map: 将有效的字符串转换为f64类型。s.parse::<f64>().ok()尝试将字符串s解析为f64,如果解析成功,ok()返回Some(f64),否则返回Nonefilter_map会过滤掉None,并将Some(f64)中的f64提取出来。
  3. .fold():
    • 初始化一个累加器(0.0, 0),第一个元素用于累加浮点数的和,第二个元素用于统计有效浮点数的个数。
    • 每次迭代,将当前的浮点数加到总和sum中,并将计数count加1。
  4. .map():
    • 最后根据有效浮点数的个数计算平均值。如果有效浮点数个数count大于0,则返回总和sum除以个数count的结果;否则返回0.0。