Programación General > Java

 ArrayList de objetos contains para variable especifica SOLUCIONADO

(1/1)

portirijillo:
Saludos, he jugado un poco con los arraylist y vector, sus interesantes métodos, etc.

Cuando tenemos un arraylist de Strings por ejemplo:

--- Código: ---ArrayList<String> nombre = new ArrayList<String>();
nombre.add("el");
nombre.add("yo");
nombre.add("usted");

nombre.contains("el");
--- Fin del código ---

Al hacer contains en dicho array, resultara true porque existe un objeto de tipo string "el" en la lista.

Pero ahora tengo un array de pelotas

--- Código: ---class Pelota {
   String nombre;
   int precio;
 ......
..
}
--- Fin del código ---

al hacer contains tengo entendido compara objetos, sea el hascode o referencia del objeto. Pero me habian dicho que si sobreescribia el metodo equals de la clase Object, se podia personalizar el contains, para que pudiera hacer lo siguiente


--- Código: ---ArrayList<Pelota> pelotas = new ArrayList<Pelota>();

pelotas.add(new Pelota("basquet",80));
pelotas.add(new Pelota("beis",100));

pelotas.contais("futbol");

--- Fin del código ---

Entonces si se sobreescribio el metodo equals en Pelota

--- Código: ---   
public boolean equals (Object o) {
    String x = (String) o;
        if (x.equals(nombre)) return true;
        return false;
}
--- Fin del código ---

deberia responder correctamente el metodo contains, pero no es asi. Alguien puede orientarme.

arielb:
Hola, te falta sobreescribir el método hashCode()   :yes:

portirijillo:
Gracias por responder. Lei como sobreescribir hasCode(), y se necesita tener cuidado, intente con varias formas sin conseguir resultado. A continuacion coloco como quedaron.


--- Código: ---public class Pelota {
protected String nombre;
protected int precio;

public Pelota(String n, int p) {
nombre = n;
precio = p;
}

public String getNombre() {
return nombre;
}

@Override
public boolean equals(Object c) {
return nombre.equals((String)c);
}

@Override
public int hashCode() {
return nombre.hashCode();
}

}

--- Fin del código ---


--- Código: ---public int hashCode() {
return 1;
}
--- Fin del código ---

yy la clase de prueba


--- Código: ---import java.util.ArrayList;


public class Test {
public static void main(String[] args) {
ArrayList<Pelota> pelotas = new ArrayList<Pelota>();
pelotas.add(new Pelota("beis",15));
pelotas.add(new Pelota("fut",10));
pelotas.add(new Pelota("basquet",915));
pelotas.add(new Pelota("volei",159));

System.out.println(pelotas.contains("beis"));
}

}
--- Fin del código ---

Siguiendo sin resultado, dando false para ambos casos de hascode.

portirijillo:
OO acabo de ver cual es el problema, al parecer tiene algo que ver con definir el tipo de objetos que guardara el ArrayList, y como le dije que guardara pelotas, pelotas necesita introducir en contains.

Por lo tanto los códigos quedarían de la siguiente manera.


--- Código: ---public class Pelota {
protected String nombre;
protected int precio;

public Pelota(String n, int p) {
nombre = n;
precio = p;
}

public String getNombre() {
return nombre;
}

public boolean equals(Object obj) {
return nombre.equalsIgnoreCase(((Pelota)obj).nombre);
}


}
--- Fin del código ---

Clase prueba

--- Código: ---import java.util.ArrayList;


public class Test {
public static void main(String[] args) {
ArrayList<Pelota> pelotas = new ArrayList<Pelota>();
pelotas.add(new Pelota("beis",15));
pelotas.add(new Pelota("fut",10));
pelotas.add(new Pelota("basquet",915));
pelotas.add(new Pelota("volei",159));

System.out.println(pelotas.contains(new Pelota("beis",15)));
}

}
--- Fin del código ---
Resultando true.

No fue necesario sobrescribir el método hasCode(), pero de igual modo la manera correcta en la cual deberían quedar la clase Pelota, seria la siguiente.


--- Código: ---public class Pelota {
protected String nombre;
protected int precio;

public Pelota(String n, int p) {
nombre = n;
precio = p;
}

public String getNombre() {
return nombre;
}


public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((nombre == null) ? 0 : nombre.hashCode());
return result;
}

public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Pelota other = (Pelota) obj;
if (nombre == null) {
if (other.nombre != null)
return false;
} else if (!nombre.equals(other.nombre))
return false;
return true;
}

}
--- Fin del código ---

Ello porque hasCode podría ser invocado al usar métodos de la clase Collections. En fin

Gracias por la ayuda.

Navegación

[0] Índice de Mensajes

Ir a la versión completa