SoloCodigo
Programación General => Java => Mensaje iniciado por: portirijillo en Miércoles 30 de Enero de 2013, 04:18
-
Saludos, he jugado un poco con los arraylist y vector, sus interesantes métodos, etc.
Cuando tenemos un arraylist de Strings por ejemplo:
ArrayList<String> nombre = new ArrayList<String>();
nombre.add("el");
nombre.add("yo");
nombre.add("usted");
nombre.contains("el");
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
class Pelota {
String nombre;
int precio;
......
..
}
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
ArrayList<Pelota> pelotas = new ArrayList<Pelota>();
pelotas.add(new Pelota("basquet",80));
pelotas.add(new Pelota("beis",100));
pelotas.contais("futbol");
Entonces si se sobreescribio el metodo equals en Pelota
public boolean equals (Object o) {
String x = (String) o;
if (x.equals(nombre)) return true;
return false;
}
deberia responder correctamente el metodo contains, pero no es asi. Alguien puede orientarme.
-
Hola, te falta sobreescribir el método hashCode() :yes:
-
Gracias por responder. Lei como sobreescribir hasCode(), y se necesita tener cuidado, intente con varias formas sin conseguir resultado. A continuacion coloco como quedaron.
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();
}
}
public int hashCode() {
return 1;
}
yy la clase de prueba
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"));
}
}
Siguiendo sin resultado, dando false para ambos casos de hascode.
-
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.
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);
}
}
Clase prueba
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)));
}
}
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.
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;
}
}
Ello porque hasCode podría ser invocado al usar métodos de la clase Collections. En fin
Gracias por la ayuda.