rust - 相同的函数总是为相同的输入返回不同的答案
问题描述
在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]
这是一个可在操场上运行的示例
为什么输出与相同的输入值不同?
解决方案
您分配*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
与模式,然后未来的对永远不会大到足以改变它。*k
mode
0
推荐阅读
- sql - 收集重复复合键的 SQL 查询
- javascript - Javascript正则表达式从字符串中删除字符
- python - 无法从 google collab 中的 python 文件导入 python 模块
- python-3.8 - encodlistknown=findencoding(images) encode=face_recognition.face_encodings(img)[0] Indexerror:list index out of range
- javascript - 如何在 ol.js 中修改 2 个多边形
- eclipse - 动态 Web 项目向常规 Java 项目添加方面
- python - 使用 seaborn 绘制均值和 95% CI 值
- next.js - Vercel 504 Bad Gateway 错误页面,尽管代码在开发模式下工作
- android - 在本机反应期间无法解析依赖关系树
- c# - NuGet 版本不匹配:System.IO.FileNotFoundException