如何查找数组、向量或切片中元素的索引?

问题描述 投票:0回答:2

我需要在字符串向量中找到元素的索引。这是我到目前为止得到的:

fn main() {
    let test: Vec<String> = vec![
        "one".to_string(),
        "two".to_string(),
        "three".to_string(),
        "four".to_string(),
    ];

    let index: i32 = test
        .iter()
        .enumerate()
        .find(|&r| r.1.to_string() == "two".to_string())
        .unwrap()
        .0;
}

它产生一个错误:

error[E0308]: mismatched types
  --> src/main.rs:9:22
   |
9  |       let index: i32 = test
   |  ______________________^
10 | |         .iter()
11 | |         .enumerate()
12 | |         .find(|&r| r.1.to_string() == "two".to_string())
13 | |         .unwrap()
14 | |         .0;
   | |__________^ expected i32, found usize

我认为这是因为

enumerate()
返回一个
(usize, _)
的元组(如果我错了,请纠正我),但是如何在这里将
usize
转换为
i32
呢?如果有更好的方法,我愿意接受建议。

rust iterator
2个回答
271
投票

我认为你应该看看

position
方法。

fn main() {
    let test = vec!["one", "two", "three"];
    let index = test.iter().position(|&r| r == "two").unwrap();
    println!("{}", index);
}

您可以在这里测试

请注意,这适用于任何迭代器,因此它可用于向量、数组和切片,所有这些都会生成迭代器。


76
投票

TLDR 使用带有

position
方法的迭代器,Rust 文档展示了一个很好的例子


不,这是因为索引是

usize
,而不是
i32
。事实上,
i32
完全不适合这个目的;它可能不够大,并且没有理由对其进行签名。只需使用
usize

其他一些注意事项:调用

to_string()
不是免费的,您不需要它来进行比较;您可以很好地比较字符串切片!

此外,如果您真的想将

usize
变成
i32
,您可以使用强制转换来实现:
x as i32
,尽管这不会在溢出或下溢时产生错误( 结果可能为负)。

总而言之,正如 Mathieu David 的回答中所指出的,迭代器上有一个

position

 方法可以完成你想要的事情。
    

© www.soinside.com 2019 - 2024. All rights reserved.