2016-12-24 80 views
3

我有一個Vec<Vec<char>>,我想找到一個特定字符的所有x,y位置,比如說'x'。我可以使用枚舉的double for循環並手動構建解決方案(並且我猜想這是一個理智的事情),但是有沒有一種很好的方法可以只用迭代器來完成它?如何在沒有for循環的情況下搜索2D數組?

或多或少我正在尋找方法來清潔這件事:

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

我試過了,但我做得越少,看起來就越沒有理智。 – ljedrz

回答

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(); 

的實現就留給讀者自己練習。 :-)

+0

OP在'(usize,(usize,&char))'裏面寫了一個帶元組的元組''。無論如何你的解決方案工作?我在學習生鏽,所以這是一個新手評論。 – Stargateur

+1

問題還問到元組是否可以變平,即刪除元組嵌套。 –

相關問題