¿Mejor forma de encontrar el índice del elemento en ArrayList?

89

Para una aplicación de Android, tengo la siguiente funcionalidad

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 esa la "mejor" forma de escribir una función para obtener la posición de un elemento? ¿O hay una función nativa de shmancy elegante en java que debería aprovechar?

Jacksonkr
fuente
2
Es probable que este código tenga errores: el uso de ==producirá resultados incorrectos en la mayoría de los casos.
3
Recuerde, no puede comparar cadenas con '==', debe usar String.equals (String str)
MrZander
5
@MrZander Seguro que puedes compararlos con ==... simplemente no es el tipo de comparación correcto ;-)
Se puede decir que todavía soy nuevo en Java ... ¿se String.equalsparece más a lo que ===podría ser en un lenguaje como JavaScript? p.ej. verificaciones contra valor Y tipo?
Jacksonkr
3
No. == es identidad de objeto y significa "es el mismo objeto" . (Esta vista es válida tanto para valores primitivos como para tipos de referencia, si considera que solo hay un número con el valor 42 o char 'x', etc.). Object.equalses un método virtual definido para todas las instancias de objetos y significa "tiene el mismo valor" , ya que todos los tipos de clases extienden Object, y deben usarse para todas las pruebas de igualdad de objetos . Hay muchas preguntas en cover ==vs Object.equalsy este es un concepto muy importante de entender. Por ejemplo, esto es falso "hello" == new String("hello"):! Doh!

Respuestas:

192

ArrayListtiene un indexOf()método . Consulte la API para obtener más información, pero así es como funciona:

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

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

indexOf() devolverá exactamente lo que devuelve su método, rápido.

Jon Egeland
fuente
3
No es "más rápido" en términos de complejidad que el código publicado, aunque puede implementarse de manera más eficiente. Además, indexOf reaccionará de manera ligeramente diferente aquí: el código original [incorrectamente] usa ==mientras que indexOf usa equals().
De hecho, es casi el mismo código exactamente (al menos en el código Sun Java 6 que tengo), excepto que lo inician con una rama if-else que maneja null por separado.
yshavit
Tiene matrices antiguas conectadas y List <> tiene el método FindIndex () pero la API cambia en el medio para ArrayList: D
boctulus
16
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 de lista: 7

Si pasa H , devolverá 7 , si pasa J , devolverá -1 como definimos el valor predeterminado en -1.

Hecho

Hiren Patel
fuente
Cómo puedo hacer el tornillo de banco al revés de esto, para su solución, su entrada es H y obtiene la posición de H , suponga que si mi entrada es el Índice de 7, ¿cómo puedo obtener el valor de Cadena de ese índice? Gracias
Jimale Abdi
1
@JimaleAbdi Haz yourArrayList.get (7). 7 es tu posición.
Hiren Patel
6

Si Listestá ordenado y tiene un buen acceso aleatorio (como lo ArrayListtiene), debería investigar Collections.binarySearch. De lo contrario, debe usar List.indexOf, como han señalado otros.

Pero su algoritmo es sólido, fwiw (aparte de los ==otros han señalado).

yshavit
fuente
3

De hecho, hay una elegante función nativa de shmancy 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)

Podrías llamarlo de la _categoriessiguiente manera:

_categories.indexOf("camels")

No tengo experiencia con la programación para Android, pero esto funcionaría para una aplicación Java estándar.

Buena suerte.

habas oxidado
fuente
1
la función nativa implica C \ C ++ para mí ... Solo digo.
Hunter McMillen
3

La API de Java especifica dos métodos que puede utilizar: 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, que sería como buscar en la lista hacia atrás.

danca
fuente
1

La mejor manera de encontrar la posición del elemento en la lista es utilizando la interfaz de Colecciones,

P.ej,

List<Integer> sampleList = Arrays.asList(10,45,56,35,6,7);
Collections.binarySearch(sampleList, 56);

Salida: 2

Pradeesh MP
fuente
1

Utilice el método indexOf () para encontrar la primera aparición del elemento en la colección.

Vasu Dev Garg
fuente
0

la mejor solución aquí

class Category(var Id: Int,var Name: String)
arrayList is Category list
val selectedPositon=arrayList.map { x->x.Id }.indexOf(Category_Id)
spinner_update_categories.setSelection(selectedPositon)
Fatih Çakıroğlu
fuente