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?
==
producirá resultados incorrectos en la mayoría de los casos.==
... simplemente no es el tipo de comparación correcto ;-)String.equals
parece más a lo que===
podría ser en un lenguaje como JavaScript? p.ej. verificaciones contra valor Y tipo?==
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.equals
es 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==
vsObject.equals
y este es un concepto muy importante de entender. Por ejemplo, esto es falso"hello" == new String("hello")
:! Doh!Respuestas:
ArrayList
tiene unindexOf()
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.fuente
==
mientras que indexOf usaequals()
.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
fuente
Si
List
está ordenado y tiene un buen acceso aleatorio (como loArrayList
tiene), debería investigarCollections.binarySearch
. De lo contrario, debe usarList.indexOf
, como han señalado otros.Pero su algoritmo es sólido, fwiw (aparte de los
==
otros han señalado).fuente
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
_categories
siguiente 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.
fuente
La API de Java especifica dos métodos que puede utilizar:
indexOf(Object obj)
ylastIndexOf(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.fuente
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
fuente
Utilice el método indexOf () para encontrar la primera aparición del elemento en la colección.
fuente
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)
fuente