在Rust中检查所有向量的长度是否相同

4

给定一个值为T的向量向量,即Vec<Vec<T>>

怎么优雅地检查内部向量是否具有相同的长度?(不依赖于外部库)

也就是说,如果所有内部向量的长度相同,则为true,否则为false


1
你希望零项向量的行为是什么? - Shepmaster
@Shepmaster 假设至少存在一个向量。 - kentwait
2个回答

7
您可以使用all方法来检查迭代器的所有元素是否与谓词匹配。然后只需将其与列表中的第一个元素进行比较。
fn main() {
    let vec_of_vecs = vec![
        vec![1, 2, 3],
        vec![1, 2, 3],
        vec![1, 2, 3],
        vec![1, 2, 3],
        vec![1, 2, 3],
        vec![1, 2, 3, 4], // remove this to prove that it works for both cases
    ];
    let all_same_length = vec_of_vecs
        .iter()
        .all(|ref v| v.len() == vec_of_vecs[0].len());

    if all_same_length {
        println!("They're all the same");
    } else {
        println!("They are not the same");
    }
}

1
另外,在 itertools crate 中还有一个 all_equal 函数 - 将 Vec 映射到它们的长度,然后运行它。但是它需要一个外部依赖。 - Michail
谢谢@Michail,我知道itertools。让我们假设没有外部依赖(更新问题)。 - kentwait
vec_of_vecs为空时,这会导致恐慌。 - Jorge Leitao

3

我认为更通用和惯用的解决方案是:

fn all_eq_len<'a, T, E: 'a>(collection: T) -> bool
where
    T: IntoIterator<Item = &'a Vec<E>>,
{
    let mut iter = collection.into_iter();
    if let Some(first) = iter.next() {
        let len = first.len();
        iter.all(|v| v.len() == len)
    } else {
        true
    }
}

当然,还可以使用itertools:
use itertools::Itertools;

vec_of_vecs.iter().map(|v| v.len()).all_equal()

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