我有一个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();
首先,有没有办法让元组变平?
答案 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)
我的方法是首先展平到(x,y,c)
然后过滤。我冒昧地返回实际的char
而不是引用。
需要move
闭包,否则内部闭包(在迭代器内部比外部闭包更长寿)具有对外部y
的引用。
如果我想更频繁地这样做,我会写一个Iterator
实现让我这样做:
let locs: Vec<(usize, usize, char) =
iter2d(grid)
.filter(&|_,_,c| c == 'x')
.collect();
实施留给读者练习。 : - )