例如,如何在下面的2D数组中找到包含值20的位置?

let nested_array = [
    [17, 16, 15, 14, 13],
    [18, 5, 4, 3, 12],
    [19, 6, 1, 2, 11],
    [20, 7, 8, 9, 10],
    [21, 20, 23, 24, 25],
];

值可能不是唯一的.

推荐答案

你可以自己玩for圈.或者,您可以使用find()或更多,特别是find_map()position():

let find = 20;

let pos = nested_array.iter().enumerate().find_map(|(i, arr)| {
    let j = arr.iter().position(|x| x == &find)?;
    Some((i, j))
});

我们可以断言我们得到正确的值:

let (i, j) = pos.unwrap();
let val = nested_array[i][j];

assert_eq!(i, 3);
assert_eq!(j, 0);
assert_eq!(val, find);

如果要查找20的多个实例.然后,您只需将find_map()替换为filter_map():

let positions = nested_array.iter().enumerate().filter_map(|(i, arr)| {
    let j = arr.iter().position(|x| x == &find)?;
    Some((i, j))
});

如果你可以在同一行中有多个20个实例,那么你可以这样做:

let positions = nested_array
    .iter()
    .enumerate()
    .flat_map(|(i, arr)| {
        let arr = arr.iter().enumerate();
        std::iter::repeat(i).zip(arr)
    })
    .filter_map(|(i, (j, val))| (val == &find).then_some((i, j)));

当然,所有这些都可以用几种变体来编写.因此,主要的外卖是find_map()filter_map()position().

Rust相关问答推荐

if let声明中临时对象的生存期

收集RangeInclusive T到Vec T<><>

关联类型(类型参数)命名约定

通过使用光标拖动角来绕其中心旋转矩形

无法将记录器向下转换回原始 struct

Rust中WPARAM和VIRTUAL_KEY的比较

在运行特定测试时,如何 suppress cargo test 的空输出?

为什么BufReader实际上没有缓冲短寻道?

Rust 中什么时候可以返回函数生成的字符串切片&str?

期望一个具有固定大小 x 元素的数组,找到一个具有 y 元素的数组

为什么`tokio::main`可以直接使用而不需要任何导入?

如何使用tracing-subscriberRust crate 构建多编写者、全局过滤订阅者

一旦令牌作为文字使用,声明宏不匹配硬编码值?

判断对象是 PyDatetime 还是 Pydate 的实例?

使用方法、关联函数和自由函数在 Rust 中初始化函数指针之间的区别

Rust 跨同一文件夹中文件的可见性

需要括号的宏调用中的不必要的括号警告 - 这是编写宏的糟糕方法吗?

编写 TOML 文件以反序列化为 struct 中的枚举

加入动态数量的期货

为什么在使用 self 时会消耗 struct 而在解构时不会?