我理解如何对整个载体进行操作,但我不认为这是惯用的Rust:
fn median(v: &Vec<u32>) -> f32 {
let count = v.len();
if count % 2 == 1 {
v[count / 2] as f32
} else {
(v[count / 2] as f32 + v[count / 2 - 1] as f32) / 2.0
}
}
fn main() {
let mut v1 = vec![3, 7, 8, 5, 12, 14, 21, 13, 18];
v1.sort();
println!("{:.*}", 1, median(&v1));
}
但是如果我只想操作这个载体的一半呢?例如,第一个四分位数是下半部分的中位数,第三个四分位数是上半部分的中位数。我的第一个想法是构建两个新的向量,但这似乎不太正确。
我如何得到&#34;一半&#34;一个载体?
答案 0 :(得分:6)
如上所述,您希望使用slice Index
trait创建Range
:
let slice = &v1[0..v1.len() / 2];
这是另一个原因why it is discouraged to accept a &Vec
。当前代码需要将切片转换为已分配的Vec
。相反,重写它以接受切片:
fn median(v: &[u32]) -> f32 {
// ...
}
由于您可能有兴趣将矢量/切片分成两半并获得两个部分,split_at
可能是相关的:
let (head, tail) = v1.split_at(v1.len() / 2);
println!("{:.*}", 1, median(head));
println!("{:.*}", 1, median(tail));
答案 1 :(得分:-1)
如何找到向量的中位数:
fn median(numbers: &mut Vec<i32>) -> i32 {
numbers.sort();
let mid = numbers.len() / 2;
if numbers.len() % 2 == 0 {
mean(&vec![numbers[mid - 1], numbers[mid]]) as i32
} else {
numbers[mid]
}
}
如何获取half
向量:
let slice: &[i32] = &numbers[0..numbers.len() / 2];
let half: Vec<i32> = numbers.drain(..numbers.len()/2).collect()