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.