remove from example array java search arraylist indexof

java - from - Mejor forma de encontrar el índice del artículo desde ArrayList<CustomObject>



remove element from list java (5)

Antes que nada, por favor corrígeme si me equivoco. Deseo encontrar el índice del artículo (es decir, el valor de cadena) de ArrayList<CustomType> sin usar For Loop.

POJO:

id; name;

Código:

ArrayList<POJO> list = new ArrayList<POJO>; //Lots of data added to these list...

Ahora quiero encontrar la identificación del nombre particular de la lista de arrays sin usar el tipo de ciclo for for.

String id = null; // TODO Auto-generated method stub for (int i = 0; i < list.size(); i++) { if("ABCD".equalsIgnoreCase(list.get(i).getName())) { id = list.get(i).getId(); break; } }

Idealmente, no quiero implementar el bucle For porque en algunos casos tengo más de 500 datos dentro de la Lista y encontrar el índice utilizando un bucle For no es una buena manera de hacerlo.


Encontrar el elemento de esta manera donde la complejidad sería darle BIG-O (n). Creo que si Map te da un mejor resultado.

HashMap sería una mejor opción. - Donde la Complejidad sería O (1).


Puede usar List.indexOf() - pero debe asegurarse de anular también POJO.equals() - (y como parte de la convención - también hashCode() .

Sin embargo, tenga en cuenta que el resultado será O(n) ; una alternativa podría ser utilizar una matriz ordenada ( POJO[] ) y usar Arrays.binarySearch() o un Set / Map .

Si usa una matriz y binarySearch() , debe asegurarse de que POJO también implemente Comparable<POJO>

Tenga en cuenta que para una información estática (su lista no cambia a menudo / en absoluto), aunque arrays y binarySearch() son "peores" que HashSet en términos de notaciones de gran O, en la práctica, a menudo es mucho más rápido, especialmente para listas relativamente cortas.
En términos de notación de gran O, una solución basada en hash ofrece un O(1) promedio de acceso a casos.


Si necesita buscar en un valor de cadena, debe usar un HashMap lugar de ArrayList .


Puedes usar list.indexOf() , pero para que funcione, debes anular equals y hasCode de tu POJO .

Por defecto, dos objetos se considerarán iguales si tienen la misma referencia. Puede sobrescribir equals para que funcionen para su caso:

public boolean equals(Object o) { if (!(o instanceof POJO)) { return false; } POJO other = (POJO) o; return name.equalsIgnoreCase(other.getName()); }

Ignorar equivalentes sugiere hashCode . Por ejemplo:

public int hashCode() { return name.hashCode(); }


Gracias a todos por su amable y rápida respuesta. Pero un agradecimiento especial a Joachim Sauer . Tiene toda la razón en que 500 elementos no son muchos, es probable que este bucle no tenga un efecto real en el rendimiento de su código (incluso aunque sea ineficiente). Incluso pruebo hasta 5000 elementos y todavía no hay un impacto negativo en el rendimiento.

Gracias a todos una vez más y gracias por su comentario Joachim Sauer .