rust 比较两个向量或字符串的最佳方法是什么?

kx1ctssn  于 2023-01-09  发布在  其他
关注(0)|答案(2)|浏览(131)

在Rust中逐个元素比较两个向量或字符串的最佳方法是什么,同时能够对每对元素进行处理?例如,如果你想统计不同元素的数量,我使用的方法是:

let mut diff_count: i32 = 0i32;
for (x, y) in a.chars().zip(b.chars()) {
    if x != y {
        diff_count += 1i32;
    }
}

这是正确的方法还是有更规范的方法?

rjee0c15

rjee0c151#

要获得匹配元素的计数,我可能会使用filtercount

fn main() {
    let a = "Hello";
    let b = "World";

    let matching = a.chars().zip(b.chars()).filter(|&(a, b)| a == b).count();
    println!("{}", matching);

    let a = [1, 2, 3, 4, 5];
    let b = [1, 1, 3, 3, 5];

    let matching = a.iter().zip(&b).filter(|&(a, b)| a == b).count();
    println!("{}", matching);
}
  • Iterator::zip接受两个迭代器,并产生每个迭代器值的元组的另一个迭代器。
  • Iterator::filter引用迭代器的值,并丢弃 predicate 闭包返回false的任何值。
  • Iterator::count计算迭代器中的元素数。

注意Iterator::zip在 * 一个 * 迭代器用完时停止迭代,如果你需要不同的行为,你可能也会对Itertools::zip_longestItertools::zip_eq感兴趣。

zvokhttg

zvokhttg2#

如果你想使用@Shepmaster的答案作为单元测试中使用的Assert的基础,试试这个:

fn do_vecs_match<T: PartialEq>(a: &Vec<T>, b: &Vec<T>) -> bool {
    let matching = a.iter().zip(b.iter()).filter(|&(a, b)| a == b).count();
    matching == a.len() && matching == b.len()
}

当然,在浮点数上使用时要小心!那些讨厌的NaN不会进行比较,你可能想使用一个容差来比较其他值。你可能想通过告诉索引第一个不匹配的值来使它更花哨。

相关问题