例如,如何在下面的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],
];
值可能不是唯一的.
例如,如何在下面的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()
.