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
Ir a la versión completa