aがVec<Vec<char>>
あり、特定の文字のすべてのx、y位置を検索したいのですが、たとえば「x」としましょう。列挙して手動でソリューションを構築するdoubleforループを使用できます(これは正しいことだと思います)が、イテレーターだけでそれを行うための良い方法はありますか?
多かれ少なかれ私はこれをきれいにする方法を探しています:
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つは、タプルをフラット化する方法はありますか?
タプルをフラット化する私の試みは次のとおりです。
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
参照ではなく実際のsを返す自由を取りました。
move
そうでない場合は(イテレータ内側、外側のクロージャよりも長く住んで、)内部クロージャは、外側への参照を持っていたので、閉鎖が必要でしたy
。
これをもっと頻繁に行いたい場合は、次のようなIterator
実装を作成します。
let locs: Vec<(usize, usize, char) =
iter2d(grid)
.filter(&|_,_,c| c == 'x')
.collect();
実装は、読者の演習として残されています。:-)
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加