2015-05-31 9 views
8

Ich brauche einen Index eines Elements in einem Vektor von Strings zu finden, ist es das, was ich so weit gekommen:finden Index eines Elements in Vektor

fn main() { 
    let test: Vec<String> = vec!["one".to_string(), "two".to_string(), "three".to_string()]; 
    let index: i32 = test.iter().enumerate().find(|&r| r.1.to_string() == "two".to_string()).unwrap().0; 
} 

es einen Fehler produziert

error: mismatched types: 
expected `i32`, 
    found `usize` 
(expected i32, 
    found usize) [E0308] 
let index: i32 = test.iter().enumerate().find(|&r| r.1.to_string() == "two".to_string()).unwrap().0; 
       ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 

Ich nehme an, das ist, weil enumerate() gibt ein Tupel von <usize, _> (korrigieren Sie mich, wenn ich falsch liege), aber wie konvertiere ich usize zu i32 hier? Wenn es einen besseren Ansatz gibt, bin ich auch offen für Vorschläge.

+0

FYI, kleine Nitpick - Tupel sind '(A, B)', nicht ''. – mdup

Antwort

9

Nein, weil Indizes usize sind, nicht i32. In der Tat ist i32 völlig ungeeignet für diesen Zweck; Es ist vielleicht nicht groß genug, und es gibt keinen Grund für die Unterzeichnung. Verwenden Sie einfach usize.

Einige andere Hinweise: Aufruf to_string() ist nicht frei, und Sie brauchen es nicht für den Vergleich; Sie können String-Slices einfach gut vergleichen!

Auch wenn Sie wirklich eine usize in ein i32 drehen möchten, können Sie das tun, mit einer Besetzung: x as i32, obwohl dies nicht erzeugen einen Fehler auf Über- oder Unterstrom (dh das Ergebnis kann negativ sein).

Alles, was gesagt, wie in Mathieu Davids Antwort erwähnt, gibt es eine position Methode auf Iteratoren, die das tut, was Sie wollen.

+0

Danke, aber ich brauche 'i32' (mehr als genug für meinen Fall) und dies produziert immer noch' usize'. Eine andere Sache ist, dass ich noch 'test.position_elem (" two ".to_string()) machen muss;' weil dies ein vereinfachtes Beispiel ist und woran ich wirklich arbeite, ist 'Vec ' - Ergebnis der gelesenen CSV-Datei Kopfzeile mit 'csv'-Kiste. – Caballero

+0

Verwaltet, um den entsprechenden Code an "usize" anzupassen, aber das 'to_string()' Bit konnte nicht vermieden werden, oder zumindest weiß ich nicht wie. – Caballero

+1

@Caballero Verwenden Sie bei minimum 'test.position_elem (" zwei ".into())' oder sogar 'test.iter(). Position (| r | r ==" zwei ")'. – Veedrac

17

Ich denke, Sie sollten stattdessen die position Methode betrachten.

fn main() { 
    let test = vec!["one", "two", "three"]; 
    let index = test.iter().position(|&r| r == "two").unwrap(); 
    println!("{}", index); 
} 

Sie können test it here.

Beachten Sie, dass dies für jeden Iterator funktioniert, so dass es für Vektoren, Arrays und Slices verwendet werden kann, die alle Iteratoren erzeugen.

+0

Sie haben Recht, ich werde meine Antwort bearbeiten. Danke für das Zeigen :) –

Verwandte Themen