Buscar
Social
Ofertas laborales ES

Foro sobre Java SE > Busqueda en ArrayList Coleccion

Buen día,
Espero puedan ayudarme, no encuentro naa en la red, como puedo hacer una busqueda mas eficiente en un ArrayList.

Tengo una clase:


class MiClase{
private int id;
private String nombre;

public MiClase(int id, String nombre) {
this.id = id;
this.nombre = nombre;
}

public int getId() {
return id;
}

public void setId(int id) {
this.id = id;
}

public String getNombre() {
return nombre;
}

public void setNombre(String nombre) {
this.nombre = nombre;
}
}

Entonces declaro un arraylist:


ArrayList<MiClase> MiLista = new ArrayList<MiClase>();
MiLista.add(new MiClase(1,"javier"));
MiLista.add(new MiClase(2,"carlos"));
MiLista.add(new MiClase(3,"miguel"));
MiLista.add(new MiClase(4,"juan"));
MiLista.add(new MiClase(5,"cesar"));
MiLista.add(new MiClase(6,"alberto"));

y si quiero buscar en el arrraylist por medio de index of y saber la posicion que tega el nombre cesar, o el id 6, saber exactamente en que posicion está por medio de index of, sin usar bucle.

en javascrip puedo hacer eso por medio de:

Aqui por ejemplo yo busco en un array y cada posicion de ese array es un objecto json.

var pos = arrayTecnicos.map(function(e) { return e.IdRegistro; }).indexOf(IdTecnico);

Alguna manera que se pueda usar indexof en arraylist tipo coleccion en Java. Gracias.

febrero 18, 2016 | Unregistered CommenterJavier

Hola, pues aquí en java una forma podría ser algo así:

int pos=arrayTecnicos.indexOf(arrayTecnicos.stream().filter(tecnico -> tecnico.getId()== idABuscar).findFirst().get());

Bueno, eso, esto es una de las formas de hacerlo, hay muchas otras.
Un saludo.

febrero 18, 2016 | Registered Commenterloderain

Hola,
gracias por la respuesta, java lo utilizo en Android studio, pero aqui no me reconoce


int pos = MiLista.indexOf(MiLista.stream().filter(tecnico -> tecnico.getId() == idABuscar).findFirst().get());

MiLista.stream() me sale error en la palabra stream, segun android studio no tiene ese metoro el arraylist

https://drive.google.com/open?id=0ByeEM1RUvXQcemNsdk1qeHF3VVU

febrero 18, 2016 | Unregistered CommenterJavier

Se puede resolver sin bucles a partir de JavaSE 1.8 con lambdas, como ya te han explicado.
Desconozco si Android usa lambdas o no, o si los usa si se parecen a los de JavaSE 1.8 o no. De todos modos, este foro está dedicado a JavaSE, no a Android.

Un detalle a tener en cuenta, respecto a la solución con lambdas, es que si el filter no encuentra ninguna coincidencia, findFirst().get() lanzará una NoSuchElementException, lo que suele ser bastante desagradable.
Por ello se suele utilizar findFirst.isPresent() que devuelve true si hay un valor, y false si no lo hay, antes de usar su get().

febrero 18, 2016 | Registered Commenterchoces

Hola de nuevo, esas funciones, como dice choces, son de java 8, creo que se puede usar en android, pero no estoy totalmente seguro. Te insto a que lo investigues, porque java 8 tiene unas mejoras bastante buenas.

Por cierto choces buen puntualización con lo de preguntar isPresent(), así evitas la excepción.

Por otro lado, existe otra forma en que podría hacerse sin streams ni lambdas, para versiones anteriores a la jdk, pero hay que formar mas follón.

Para hacerlo, deberías implementar en tu clase modelo, en tu caso, MiClase, el método equals, indicando que dos instancias de esa clase son iguales si el id es igual. Algo así:


@Override
public boolean equals(Object obj) {
boolean igual;
MiClase objeto = (MiClase) obj;
if (this.id == objeto.id) {
igual=true;
}else{
igual=false;
}
return igual;
}

Después, también tienes que añadir a tu clase MiClase un constructor por id, para poder crear instancias de tu clase con solo el id. Sería añadir a tu clase algo asi:


public MiClase(int id) {
this.id = id;
}

Y finalmente, una vez que tengas todo esto, y tengas un array de elementos de esa clase en la que quiers buscr la posicion de un elemento a través del id, haces lo siguiente:


int pos =array.indexOf(new MiClase(idABuscar));

Esto funciona, ya que el método indexOf se basa en el método equals para devolver la posición de un objeto. Al definir el equals diciendo que dos objetos son iguales si el id es igual, el método indexOf() nos devuelve un objeto que es equals al pasado por parámetro.

Por tanto es una posible solución sin usar lambdas, pero como ves, es bastante farragosa.

Bueno un saludo!!

febrero 18, 2016 | Unregistered Commenterloderain