2015-05-31 27 views
8

ho bisogno di trovare un indice di un elemento in un vettore di stringhe, questo è quello che ho ottenuto finora:trovare indice di un elemento nel vettore

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; 
} 

si tratta di produrre un errore

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; 
       ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 

Suppongo che sia perché enumerate() restituisce una tupla di <usize, _> (correggimi se ho torto), ma come posso convertire usize in i32 qui? Inoltre, se esiste un approccio migliore, sono aperto a suggerimenti.

+0

FYI, minor nitpick - le tuple sono '(A, B)', non ''. – mdup

risposta

9

No, è perché gli indici sono usize, non i32. Infatti, i32 è completamente inappropriato per questo scopo; potrebbe non essere abbastanza grande, e non c'è motivo per farlo firmare. Basta usare usize.

Alcune altre note: chiamare to_string() non è gratuito e non è necessario per il confronto; è possibile confrontare le fette di stringa bene!

Inoltre, se si davvero desidera trasformare un usize in un i32, è possibile farlo con un cast: x as i32, anche se questo nonprodurre un errore sul sovra o sotto-flusso (cioè il risultato potrebbe essere negativo).

Tutto ciò detto, come indicato nella risposta di Mathieu David, c'è un metodo position su iteratori che fa ciò che vuoi.

+0

Grazie, ma ho bisogno di 'i32' (più che sufficiente per il mio caso) e questo produce ancora' usize'. Un'altra cosa è che ho ancora bisogno di fare 'test.position_elem (" two ".to_string());' perché questo è un esempio semplificato e quello con cui sto veramente lavorando è un 'Vec ' - risultato del file csv letto intestazione con la gabbia 'csv'. – Caballero

+0

Gestito per adattare il codice rilevante a 'usize', ma il bit' to_string() 'non può essere evitato, o almeno non so come. – Caballero

+1

@Caballero Al minimo usare 'test.position_elem (" two ".into())' o even'test.iter(). Position (| r | r == "two") '. – Veedrac

17

Penso che dovresti invece guardare al metodo position.

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

È possibile test it here.

Nota che questo funziona per qualsiasi iteratore, quindi può essere utilizzato per vettori, matrici e sezioni, che producono tutti iteratori.

+0

Hai ragione, modifico la mia risposta. Grazie per averlo indicato :) –

Problemi correlati