如何在Rust中获取向量中的最小值?

57

我正在尝试在Rust中显示向量中的最小值,但找不到一个好的方法。

给定一个 i32 类型的向量:


let mut v = vec![5, 6, 8, 4, 2, 7];

我的目标是在不排序的情况下获取该向量的最小值。

在Rust中,获取Vec<i32>中最小值的最佳方法是什么?

4个回答

63
let minValue = vec.iter().min();
match minValue {
    Some(min) => println!( "Min value: {}", min ),
    None      => println!( "Vector is empty" ),
}

https://doc.rust-lang.org/std/iter/trait.Iterator.html#method.min

fn min(self) -> Option<Self::Item>
where
    Self::Item: Ord, 

Returns the minimum element of an iterator.

If several elements are equally minimum, the first element is returned. If the iterator is empty, None is returned.

我发现这个Gist包含了一些常见的C#/.NET Linq操作,用Swift和Rust表达,非常方便: https://gist.github.com/leonardo-m/6e9315a57fe9caa893472c2935e9d589


谢谢Dai,我认为这是获取最大值,那么最小值呢?因为当我执行println!("{:#?}", maxValue);时,返回的是Some(8),但实际上我只需要得到8。因为println!("{}", maxValue);会返回一个错误。 - octano
@octano println!("{}", maxValue.unwrap()); 意为:打印出最大值,即 maxValue.unwrap() 的值。 - tenxsoydev

20
let mut v = vec![5, 6, 8, 4, 2, 7];
let minValue = *v.iter().min().unwrap();

6
在Rust中我还是比较新手,但是这里的 * 究竟是做什么用的呢?即使没有它也能运行。 - Callum Matthews
1
@CallumMatthews 你可以在这个问题中找到答案,https://dev59.com/MVkR5IYBdhLWcg3w_CD- - Hercislife

5

你好 @octano,就像Dai已经回答的那样,min/max 返回的是 Option<> 值,所以你只能像示例中一样进行匹配:

fn main() {
    let vec_to_check = vec![5, 6, 8, 4, 2, 7];
    let min_value = vec_to_check.iter().min();
    match min_value {
        None => println!("Min value was not found"),
        Some(i) => println!("Min Value = {}", i)
    }
}

Iter.min() 的 Play Ground 示例


@aws_apprentice 当blandger回复时,我的答案没有包括match部分。这只是不巧的时间问题。 - Dai
在这个网站上,对于重复答案没有具体规定。欢迎你扩展你的回答以吸引更多的赞同,关键是要发布正确的答案。 - Reactgular
是的,重复的原因是时间问题,我发布了答案,Dai很快更新了他的答案。 - blandger

0
let max = nums.iter().max().unwrap_or(&0);

你可以使用unwrap_or(value)来返回默认值,如果找不到最大值的话。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接