2011-12-08 8 views
64

Per un'applicazione Android, ho le seguenti funzionalitàUn modo migliore per trovare l'indice dell'elemento in ArrayList?

private ArrayList<String> _categories; // eg ["horses","camels"[,etc]] 

private int getCategoryPos(String category) { 
    for(int i = 0; i < this._categories.size(); ++i) { 
     if(this._categories.get(i) == category) return i; 
    } 

    return -1; 
} 

è che il modo "migliore" per scrivere una funzione per ottenere la posizione di un elemento? O c'è una fantasia nativa shmancy in java che dovrei sfruttare?

+1

questo codice è probabilmente difettosa: uso di '' == consentiranno di ottenere risultati non corretti nella maggior parte dei casi. –

+3

Ricorda, non puoi confrontare le stringhe con '==', devi usare String.equals (String str) – MrZander

+5

@MrZander Certo puoi confrontarle con '==' ... non è il tipo giusto di confronto ;-) –

risposta

147

ArrayList ha un indexOf() method. Controllare l'API di più, ma ecco come funziona:

private ArrayList<String> _categories; // Initialize all this stuff 

private int getCategoryPos(String category) { 
    return _categories.indexOf(category); 
} 

indexOf() tornerà esattamente ciò che il metodo restituisce, veloce.

+2

Non è "veloce" in termini di complessità rispetto al codice pubblicato, sebbene possa essere implementato in modo più efficiente. Inoltre, indexOf reagirà in modo leggermente diverso qui: il codice originale [erroneamente] usa '==' mentre indexOf usa 'equals()'. –

+0

In realtà, è quasi lo stesso codice esattamente (almeno nel codice di Sun Java 6 ho), salvo che iniziano con un ramo if-else che gestisce nulla a parte. – yshavit

+0

E 'vecchi sistemi cablati e List <> avere metodo FindIndex(), ma i cambiamenti di API in mezzo per ArrayList: D – boctulus

3

Esiste in effetti una funzione nativa shmancy in java che si dovrebbe sfruttare.

ArrayList ha un metodo di istanza chiamato

indexOf(Object o)

(http://docs.oracle.com/javase/6/docs/api/java/util/ArrayList.html)

si sarebbe in grado di chiamare su _categories come segue:

_categories.indexOf("camels")

non ho esperienza con progr amming per Android - ma funzionerebbe con un'applicazione Java standard.

Buona fortuna.

+1

funzione nativa implica C \ C++ per me..Just dicendo. –

2

Java API specifica due metodi che è possibile utilizzare: indexOf(Object obj) e lastIndexOf(Object obj). Il primo restituisce l'indice dell'elemento se trovato, -1 altrimenti. Il secondo restituisce l'ultimo indice, sarebbe come cercare la lista al contrario.

6

Se il List è ordinato e ha un buon accesso casuale (come ArrayList fa), si dovrebbe guardare in Collections.binarySearch. Altrimenti, dovresti usare List.indexOf, come altri hanno sottolineato.

Ma il tuo algoritmo è audio, diverso (diverso dal == altri hanno sottolineato).

11
ArrayList<String> alphabetList = new ArrayList<String>(); 
alphabetList.add("A"); // 0 index 
alphabetList.add("B"); // 1 index 
alphabetList.add("C"); // 2 index 
alphabetList.add("D"); // 3 index 
alphabetList.add("E"); // 4 index 
alphabetList.add("F"); // 5 index 
alphabetList.add("G"); // 6 index 
alphabetList.add("H"); // 7 index 
alphabetList.add("I"); // 8 index 

int position = -1; 
position = alphabetList.indexOf("H"); 
if (position == -1) { 
    Log.e(TAG, "Object not found in List"); 
} else { 
    Log.i(TAG, "" + position); 
} 

uscita: Indice listino:

Se si passa H tornerà , se si passa J tornerà -1 come abbiamo definito valore predefinito a -1.

Done

Problemi correlati