• Domingo 17 de Noviembre de 2024, 14:46

Autor Tema:  ArrayList de objetos contains para variable especifica SOLUCIONADO  (Leído 10996 veces)

portirijillo

  • Miembro activo
  • **
  • Mensajes: 27
    • Ver Perfil
ArrayList de objetos contains para variable especifica SOLUCIONADO
« en: Miércoles 30 de Enero de 2013, 04:18 »
0
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: [Seleccionar]
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
Código: [Seleccionar]
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

Código: [Seleccionar]
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
Código: [Seleccionar]
   
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.
« última modificación: Jueves 31 de Enero de 2013, 01:44 por portirijillo »

arielb

  • Moderador
  • ******
  • Mensajes: 771
  • Nacionalidad: pa
    • Ver Perfil
    • http://coder-pa.blogspot.com
Re:ArrayList de objetos contains para variable especifica
« Respuesta #1 en: Miércoles 30 de Enero de 2013, 23:39 »
0
Hola, te falta sobreescribir el método hashCode()   :yes:
"Porque de tal manera amó Dios al mundo que dio a su hijo unigénito para que todo aquél que en él crea no se pierda mas tenga vida eterna"
Juan 3:16

http://coder-pa.blogspot.com

portirijillo

  • Miembro activo
  • **
  • Mensajes: 27
    • Ver Perfil
Re:ArrayList de objetos contains para variable especifica
« Respuesta #2 en: Jueves 31 de Enero de 2013, 01:09 »
0
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: [Seleccionar]
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();
}

}

Código: [Seleccionar]
public int hashCode() {
return 1;
}

yy la clase de prueba

Código: [Seleccionar]
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.


portirijillo

  • Miembro activo
  • **
  • Mensajes: 27
    • Ver Perfil
Re:ArrayList de objetos contains para variable especifica
« Respuesta #3 en: Jueves 31 de Enero de 2013, 01:44 »
0
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: [Seleccionar]
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
Código: [Seleccionar]
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.

Código: [Seleccionar]
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.