Foro de elhacker.net

Programación => Java => Mensaje iniciado por: ivan_esp en 9 Octubre 2014, 12:18 pm



Título: Comparar lista de objetos sin importar orden
Publicado por: ivan_esp en 9 Octubre 2014, 12:18 pm
Hola,
Estoy haciendo ejercicios de java y me he encontrado con uno que no logro resolver,a ver si me podeis echar una mano.

Resulta que tengo varias clases: Circulo,Triangulo,GrupoFiguras y UsoDeGrupoFiguras

Código
  1. public class Triangulo{
  2. private double x,y;
  3. private double base,altura;
  4.  
  5.  
  6. public boolean equals (Object c){
  7.    if(c instanceof Triangulo){
  8.        Triangulo tri=(Triangulo) c;
  9.        if(this.x==((Triangulo)c).x && this.y==((Triangulo)c).y && this.base==((Triangulo)c).base && this.altura==((Triangulo)c).altura)
  10.        return true;
  11.    }
  12.  
  13.    return false;
  14. }
  15.  
  16. //triangulo.equals(triangulo2)
  17.  
  18. Triangulo(double cx,double cy,double b, double a)
  19. {x= cx; y = cy; base = b; altura = a;}
  20.  
  21. public String toString()
  22. {return "Triangulo:\n\t"+"Posicion: ("+x+","+y+")\n\tBase: "+base+"\n\tAltura: "+altura;}}

Código
  1. public class Circulo{
  2. private double x,y;
  3. private double r;
  4.  
  5.  
  6. Circulo(double a, double b,double c)
  7. {x=a; y=b; r=c;}
  8.  
  9. public boolean equals (Object c){
  10.    if(c instanceof Circulo){
  11.        Circulo cir=(Circulo) c;
  12.        if(this.r==((Circulo)c).r && this.x==((Circulo)c).x && this.y==((Circulo)c).y) return true;
  13.    }
  14.  
  15.    return false;
  16. }
  17.  
  18.  
  19. public String toString ()
  20. {return "Circulo:\n\t"+
  21. "Posicion: ("+x+","+y+
  22. ")\n\tRadio: "+r+"\n";}}


En este el metodo equals esta mal,lo estoy probando

Código
  1. public class GrupoFiguras{
  2.  
  3. static final int MAX_NUM_FIGURAS = 10;
  4. private Object [] listaFiguras = new Object [MAX_NUM_FIGURAS];
  5. private int numF=0;
  6. public void anyadeFigura(Object o){
  7. listaFiguras[numF++]= o;
  8.  
  9. }
  10. public void anyadeCirculo(Circulo c) {listaFiguras[numF++]= c;}
  11. public void anyadeTriangulo(Triangulo t) {listaFiguras[numF++]= t;}
  12.  
  13. public boolean equals (Object c){
  14.  //  GrupoFiguras lis=(GrupoFiguras) c;
  15.    boolean igual=false;
  16.  
  17.   for(int i=0;i<this.numF;i++){
  18.   for(int j=0;j<((GrupoFiguras)c).numF;j++){
  19.  
  20.       if(this.listaFiguras[i].equals(((GrupoFiguras)c).listaFiguras[j])){igual=true;}
  21.       else{igual=false;}
  22.    }}
  23.  
  24.   for(int i=0;i<((GrupoFiguras)c).numF;i++){
  25.   for(int j=0;j<this.numF;j++){
  26.       if(((GrupoFiguras)c).listaFiguras[i].equals(this.listaFiguras[j])){igual=true;}
  27.       else{igual=false;}
  28.    }}
  29.  
  30.  
  31.    if(igual==true) return true;
  32.  
  33.  
  34.    return false;
  35.  
  36.  
  37. }
  38. public String toString(){
  39. String s= "Circulos:";
  40.  
  41. for(int i = 0;i < numF; i++)
  42. if (listaFiguras[i] instanceof Circulo) s+="\n"+listaFiguras[i];
  43. s+= "\nTriangulos:";
  44.  
  45. for(int i = 0;i < numF; i++)
  46. if (listaFiguras[i] instanceof Triangulo)s+="\n"+listaFiguras[i];
  47. return s;}}
  48.  
  49.  
  50.  

Código
  1. public class UsoDeGrupoFiguras{
  2.  
  3. public static void main (String args[]){
  4.  
  5. GrupoFiguras g = new GrupoFiguras();
  6. g.anyadeCirculo(new Circulo(10,5,3.5));
  7. g.anyadeTriangulo(new Triangulo(10,5,6.5,32));
  8. g.anyadeTriangulo(new Triangulo(10,5,6.5,32));
  9.  
  10. GrupoFiguras g2 = new GrupoFiguras();
  11. g2.anyadeCirculo(new Circulo(10,5,3.6));
  12. g2.anyadeTriangulo(new Triangulo(10,5,6.5,32));
  13. g2.anyadeTriangulo(new Triangulo(10,5,6.5,32));
  14.  
  15. System.out.println(g.equals(g2));
  16.  
  17.  
  18. Triangulo tri=new Triangulo(10,5,7.5,32);
  19. Triangulo tri2=new Triangulo(10,5,6.5,32);
  20.  
  21. //System.out.println(tri.equals(tri2));
  22.  
  23.  
  24. Circulo cir=new Circulo(10,5,3.5);
  25. Circulo cir2=new Circulo(10,5,3.5);
  26.  
  27. //System.out.println(cir.equals(cir2));
  28.  
  29. //System.out.println(g);
  30. }
  31. }

Los equals de los triangulos y circulos me funcionan bien,pero a la hora de comparar los grupos de figuras me falla.
Esto es lo que deberia hacer :
Sobrescribe el metodo equals(Object) para las clases Circulo ,Triangulo y GrupoFiguras .       Para ello supondremos que dos figuras son
iguales si contienen exactamente los mismos valores en sus atributos, y
que dos grupos de figuras son iguales si contienen las mismas figuras sin
importar el orden ni la cantidad de veces que aparezcan. Prueba los metodos equals(Object) en UsoDeGrupoFiguras comparando objetos entre si.
Que ocurre si comparas figuras de tipos diferentes? Considera los cambios
que realizarias en los metodos anyadeCirculo, anyadeTriangulo y equals de la clase GrupoFiguras si los grupos de guras fueran conjuntos, es decir, sin elementos repetidos


El problema es que no se como comparar los grupos de figuras ya que como pueden estar en distinto orden compararia un triangulo con un circulo y al reves.

Lo que necesito esque solo compare triangulos con triangulos y circulos con circulos y que sean iguales.

Saludos y gracias