Java - Dudas de trabajo de facultad

 
Vista:
sin imagen de perfil

Dudas de trabajo de facultad

Publicado por Javier (4 intervenciones) el 02/08/2014 21:56:59
Hola a la comunidad. Estoy haciendo un trabajo de la facultad en el que uso Eclipse Juno y me han surgido dudas que a lo mejor me podrían resolver aquí.

La primera tiene que ver con el siguiente método en el que quiero saber si un objeto está en un conjunto o no, y para ello uso el contains:

public static Boolean estaApp(App app, Set<App> sApp){
Boolean res = false;
if(sApp.contains(app)){
res = true;
}
return res;
}

"App" es un tipo que creé anteriormente.

El caso es que metí los tres primeros de los cuatro objetos que se ven a continuación:

App app1 = new AppImpl(TipoSO.WINDOWS, "Buscador de buenos nombres", ...);
App app2 = new AppImpl(TipoSO.ANDROID, "Buscador", ...);
App app3 = new AppImpl(TipoSO.IOS, "Otraplicacion", ...);
App app4 = new AppImpl(TipoSO.IOS, "Otraplicacion", ...);

En un conjunto que creé después:

Set<App> conjApp = new HashSet<App>();

conjApp.add(app1);
conjApp.add(app2);
conjApp.add(app3);

Y ya por último hice que se mostraran dos resultados por pantalla:

System.out.println(estaApp(app3, conjApp));
System.out.println(estaApp(app4, conjApp));

Tanto "app3" y "app4" tienen los mismos parámetros, por lo que me esperaba que por pantalla se viera:

true
true

Indicándome que ambos objetos están en el conjunto, ya que ambos son el mismo. Pero no fue así, el segundo resultado es un "false".

¿En qué me he equivocado?, ¿he usado mal el contains?
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Borja

Dudas de trabajo de facultad

Publicado por Borja (23 intervenciones) el 03/08/2014 00:15:03
Probablemente lo que pase es que el contains no compruebe que los elementos sean iguales, sino que es el mismo elemento, porque compruebe los punteros (o sea las variables) y no los parámetros que tienen. Eso es porque no sabe como saber si dos elementos son iguales o no.

En java las variables guardan la posición de memoria en la que se encuentran las estructuras, pero el valor de la variable es una dirección de memoria, no la estructura.

No se exactamente como se puede hacer, pero quizás puedas definir la función equals para tu estructura. Como cuando comparas dos String que haces:

S1.equals(S2).
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Dudas de trabajo de facultad

Publicado por Javier (4 intervenciones) el 03/08/2014 00:45:18
Muchas gracias por responder tan rápido.

El contains no serviría entonces si sólo se fija en las variables o punteros, que es lo que parece que hace.

He probado con un "for extendido":

1
2
3
4
5
6
7
8
9
10
public static Boolean estaApp2(App app, Set<App> sApp){
		Boolean res = false;
		for(App i : sApp){
			if(i.equals(app)){
				res = true;
				break;
			}
		}
		return res;
	}

La idea sería que fueran saliendo todos los elementos y se compararan con el nuevo objeto, y, si hay alguno igual, salir del "for" e indicar con un "true" que hay un elemento que cumple con las condiciones de igualdad que establecí previamente.

El problema ahora es que el resultado es el mismo, me pone que hay un elemento igual a "app3" pero no a "app4", y como antes, ambos objetos son totalmente iguales.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Dudas de trabajo de facultad

Publicado por Tom (1831 intervenciones) el 04/08/2014 16:05:41
Por lo que dices que añades app1, app2 y app3. Con lo que si buscas app4 te da, lógicamente, false.

Por cierto ... en java, _no_ estás manejando punteros. Estás manejando referencias, que no son lo mismo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Dudas de trabajo de facultad

Publicado por Javier (4 intervenciones) el 06/08/2014 01:11:39
Gracias por responder y perdón por la tardanza.

He conseguido solucionar los problemas que tenía referente al contains y el for extendido.

Ahora tengo problemas relacionados con el equals y el "==". Quería hacer un método con el que pudiera saber si en una lista existía algún objeto igual que cualquier otro objeto que quisiera comparar, tal que así:

public static Boolean hayAppIgual(List<App> l, App a){
Boolean control = false;
for(int i = 0; i < l.size(); i++){
if(a.equals(l.get(i))){
control = true;
break;
}
}
return control;
}


El equals que uso debería seguir el siguiente método:

public boolean equeals(Object o){

boolean control = false;
if(o instanceof App){
control = so.equals(((App) o).getSO());
if(control == true){
control = nombre.equals(((App) o).getNombre());
if(control == true){
control = desa.equals(((App) o).getDesarrollador());
}else{
throw new IllegalArgumentException("Las dos aplicaciones no comparten nombre...");
}
}else{
throw new IllegalArgumentException("Las dos aplicaciones no comparten sistema operativo...");
}
}else{
throw new IllegalArgumentException("Las dos aplicaciones no son iguales...");
}
return control;
}

Pero me da como resultado "false", aunque evidentemente le pase una lista en la que hay un objeto igual, según los criterios que uso, que el objeto que quiero comparar.

No sé en qué o dónde fallo, así que lo agradecería si alguien pudiera ayudarme.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Dudas de trabajo de facultad

Publicado por Tom (1831 intervenciones) el 06/08/2014 10:25:51
Cuando en una clase sobreescribes equals() tienes que redefinir también hashCode().
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Dudas de trabajo de facultad

Publicado por Javier (4 intervenciones) el 06/08/2014 12:40:13
Ya tenía el hashCode() en el tipo App. De todas formas ya he podido ver el problema de este caso. Resulta que el método "equals" que quería usar para el método de utilidad lo había llamado "equeals". Ha sido un simple error de haber escrito mal los nombres. Ahora funciona tal y como quiero.

Mi siguiente problema ahora está relacionado con "==". Lo he usado para saber si en una lista existe un objeto idéntico al que quiero comparar, y he terminado haciendo este método:

public static Boolean hayAppIdentica(List<App> l, App a){
Boolean control = false;
for(int i = 0, i < l.size(); i++){
if(a == l.get(i)){
control = true;
break;
}
}
return control;
}

Y a pesar de haber pasado un objeto para comparar que sí tiene otro objeto idéntico dentro de la lista me responde con un "false".

Nota: He entendido que dos objetos de una misma clase son idénticos cuando todos sus parámetros coinciden.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar