2016-12-24 5 views
3

Ich habe eine Vec<Vec<char>> und ich möchte alle X, Y-Positionen eines bestimmten Charakters finden, sagen wir "x". Ich kann eine doppelte for-Schleife mit enumerieren und manuell die Lösung aufbauen (und ich würde vermuten, das ist die gesunde Sache zu tun), aber gibt es eine nette Möglichkeit, es mit nichts als Iteratoren zu tun?Wie kann ich ein 2D-Array ohne for-Schleifen durchsuchen?

Mehr oder weniger ich bin auf der Suche nach Möglichkeiten, diese zu bereinigen:

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

Zum einen ist es eine Möglichkeit, die Tupel zu glätten?

+0

Ich habe versucht, aber je mehr ich tat, desto weniger gesund sah es aus. – ljedrz

Antwort

4

Hier ist mein Versuch, die die Tupel nicht abflachen:

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

Mein Ansatz war zunächst abzuflachen zu (x,y,c) und dann filtern. Ich habe mir die Freiheit genommen, die tatsächlichen char s anstatt Referenzen zurückzugeben.

Der move Verschluss wurde benötigt, weil ansonsten der innere Verschluss (der im Iterator länger lebt als der äußere Verschluss) einen Bezug zum äußeren y hatte.

Wenn ich das öfter tun wollte, würde ich eine Iterator Implementierung schreiben, die mich tun lassen:

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

Die Implementierung als eine Übung für den Leser überlassen. :-)

+0

Das OP schrieb ein Tupel mit einem Tupel in '(usize, (usize, & char))'. Deine Lösung funktioniert sowieso? Ich lerne Rost, also ist es ein Anfängerkommentar. – Stargateur

+1

Die Frage wurde auch gefragt, ob das Tupel abgeflacht werden könnte, d. H. Entfernen der Tupelverschachtelung. –

Verwandte Themen