如何在没有for循环的情况下搜索2D数组?

时间:2016-12-24 06:40:39

标签: functional-programming rust

我有一个Vec<Vec<char>>我希望找到特定字符的所有x,y位置,让我们说'x'。我可以使用带枚举的double for循环并手动构建解决方案(我猜这是理智的事情),但除了迭代器之外,还有一种很好的方法吗?

或多或少我正在寻找清理方法:

let locs: Vec<(usize, (usize, &char))> = grid.iter()
    .enumerate()
    .flat_map(|(ind, row)|
          iter::repeat(ind)
            .zip(row.iter()
               .enumerate()))
    .filter(|&(x, (y, ch))| ch == 'x')
    .collect();

首先,有没有办法让元组变平?

1 个答案:

答案 0 :(得分:4)

这是我的尝试,它确实使元组变得扁平化:

let locs: Vec<(usize, usize, char)> = grid.iter()
    .enumerate()
    .flat_map(|(y, row)| {
        row.iter()
           .enumerate()
           .map(move |(x, &c)| (x,y,c))
    })
    .filter(|&(_,_,c)| c == 'x')
    .collect();
println!("{:?}", locs)

Playground

我的方法是首先展平到(x,y,c)然后过滤。我冒昧地返回实际的char而不是引用。

需要move闭包,否则内部闭包(在迭代器内部比外部闭包更长寿)具有对外部y的引用。

如果我想更频繁地这样做,我会写一个Iterator实现让我这样做:

let locs: Vec<(usize, usize, char) =
    iter2d(grid)
    .filter(&|_,_,c| c == 'x')
    .collect();

实施留给读者练习。 : - )