2011-12-08 13 views
64

Para una aplicación para Android, que tienen las siguientes funcionalidades¿Mejor forma de encontrar el índice del artículo en 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; 
} 

es que la "mejor" manera de escribir una función para conseguir la posición de un elemento? ¿O hay una función nativa de lujo shmancy en Java que debería aprovechar?

+1

Este código es probable defectuoso: el uso de '' == producirán resultados incorrectos en la mayoría de los casos. –

+3

Recuerda, no puedes comparar cadenas con '==', tienes que usar String.equals (String str) – MrZander

+5

@MrZander Seguro que puedes compararlos con '==' ... simplemente no es el tipo correcto de comparación ;-) –

Respuesta

147

ArrayList tiene un indexOf() method. Compruebe la API para más, pero así es como funciona:

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

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

indexOf() volverá exactamente cuáles son sus devuelve el método, rápido.

+2

No es una solución "rápida" en términos de complejidad que el código publicado, aunque puede implementarse de manera más eficiente. Además, indexOf reaccionará de forma ligeramente diferente aquí: el código original [incorrectamente] usa '==' mientras que indexOf usa 'equals()'. –

+0

De hecho, es casi exactamente el mismo código (al menos en el código de Sun Java 6 que tengo), excepto que lo inician con una rama if-else que maneja null por separado. – yshavit

+0

Se trata de arreglos antiguos cableados y List <> tienen el método FindIndex(), pero la API cambia en el medio para ArrayList: la función nativa D – boctulus

3

De hecho, hay una función nativa de shmancy elegante en java que debe aprovechar.

ArrayList tiene un método de instancia llamado

indexOf(Object o)

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

usted sería capaz de llamarlo en _categories de la siguiente manera:

_categories.indexOf("camels")

no tengo experiencia con progr amming para Android, pero esto funcionaría para una aplicación Java estándar.

Buena suerte.

+1

implica C \ C++ para mí ... Solo digo. –

2

Java API especifica dos métodos que puede usar: indexOf(Object obj) y lastIndexOf(Object obj). El primero devuelve el índice del elemento si se encuentra, -1 en caso contrario. El segundo devuelve el último índice, sería como buscar la lista al revés.

6

Si su List está ordenado y tiene buen acceso aleatorio (como ArrayList), debe consultar Collections.binarySearch. De lo contrario, debe usar List.indexOf, como han señalado otros.

Pero su algoritmo es sonido, fwiw (que no sea el == que otros han señalado).

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

Salida: Índice lista:

Si pasa H se volverá , si pasa J volverá -1 como definimos valor predeterminado a -1.

hecho

Cuestiones relacionadas