首页 > 解决方案 > 相同的函数总是为相同的输入返回不同的答案

问题描述

在Rust Books 的第 8 章之后我一直在做练习。我已经实现了第一个任务,但是有一个问题:我没有改变函数和输入,但结果总是不同。

use std::collections::HashMap;

fn main() {
    println!("{:?}",vector(&mut vec![10,15,20,20]));
    println!("{:?}",vector(&mut vec![10,15,20,20]));
    println!("{:?}",vector(&mut vec![10,15,20,20]));
    println!("{:?}",vector(&mut vec![10,15,20,20]));
}

fn vector(V:&mut Vec<i32>)->[i32;3]{
    let average:i32 = V.iter().sum::<i32>()/(V.len() as i32);
    V.sort();
    let median:i32 = V[V.len()/2+1];
    let mut map = HashMap::new();
    let mut mode = 0;
    for el in V{
        let count = map.entry(el).or_insert(0);
        //or_insert returns reference to the value of the key
        *count+=1; //dereference and increase;
      }
      for (k,v) in map{
          if v>mode{
                mode=*k;
          }
      }

    return [average,median,mode]
}

输出因执行而异:

[16, 20, 20]
[16, 20, 15]
[16, 20, 15]
[16, 20, 20]

这是一个可在操场上运行的示例

为什么输出与相同的输入值不同?

标签: rust

解决方案


您分配*k给的事实mode没有意义,您的意思是分配v吗?似乎至少需要:

let mut mode = (0, 0);
for (k, v) in map {
    if v > mode.1 {
        mode = (*k, v);
    }
}

return [average, median, mode.0];

您的代码行为不确定的原因是因为哈希映射不保证迭代器生成键/值对的顺序。例如,在您提到的文档页面上,它指出

此代码将以任意顺序打印每一对:

并且因为您的代码原样使用v而不是第一次*k检查(并且v与模式,然后未来的对永远不会大到足以改变它。*kmode0


推荐阅读