0

Tengo dos objetos y deseo comparar si son iguales. Están formados por un array y un String. Y los he creado de forma que ambos tengan los mismos valores para testear si son iguales. Si comparo los Strings, devuelve true pero si comparo los objetos mediante el método equals(); devuelve false. Así mismo si sencillamente comparo los objetos mediante == devuelve false. Supongo que porque andan alojados en lugares diferentes en la memoria. Y mi pregunta es: ¿hay alguna forma de comparar dos objetos para averiguar si el contenido de los mismos es igual? Con los Strings funciona el método equals y supongo que cada String andará también alojado cada uno en un lugar diferente...

public static boolean esIgual(EnteroEnorme a, EnteroEnorme b) {


    for(int i=0; i<dim;i++) {
    if(a.getEntero()==b.getEntero()) 
        return true;}

        return false; //ESTO RETORNA FALSE AUNQUE SEAN IGUALES
}


public static boolean esEqual(EnteroEnorme a, EnteroEnorme b) {


    if(a.getString()==b.getString())
            return true;      //ESTO RETORNA TRUE SI LAS CADENAS SON  IGUALES 
                              // Y SON LAS CADENAS QUE FORMAN LOS OBJETOS QUE COMPARO ARRIBA


         return false;

}







 package utiles;

 import java.util.Objects;

 public class EnteroEnormetest {

 public static void main(String[] args) {
    // TODO Auto-generated method stub


    EnteroEnorme e1=new EnteroEnorme("1");
    EnteroEnorme e2=new EnteroEnorme("1");

    System.out.println(e1.equals(e2));
    //System.out.println(EnteroEnorme.esArrayIgual(e1, e2));
    //System.out.println(EnteroEnorme.esMayor(e1, e2));
    //System.out.print(e1.getEntero().length+"\n");




}

    }

    class EnteroEnorme{

private String s;
private int[] Entero;
private final static int dim=40;


//------------------CONSTRUCTORES-----------------------
public EnteroEnorme( String s) {


    Entero=new int[size(s)];
    this.s=s;   
    parse(s);

}

public EnteroEnorme(int[] entero) {

    this.Entero=entero;
}




public int size(String s) { //para asegurarse de que como mucho sea menos de 40

        if((s.length()>dim)||s.length()<=0) throw new NullPointerException ("ande va io");
        else return s.length();

}


//------------------------------------------------------


//----------GETTERS-----------------------
public int[] getEntero() {

    return Entero;
}

public String getString() {

    return s;
}

//-----------------------------------------

public int parse(String s) {

    for(int i=0; i<s.length(); i++) {
        Entero[i] =s.charAt(i);       //s.charAt(i)!=0? s.charAt(i):0;

            }
    return 0;
}



public  boolean equals(EnteroEnorme obj2) {


    /*Se compara la clase a si misma para verificar si es una copia exacta.
    si es una copia devuelve que son iguales*/
    if (this == obj2) return true;

    //Si el objeto pasado como párametro es null devuelve que no son iguales.
    if (obj2== null) return false;

    //Si no son del mismo tipo devuelve falso.
    if (getClass() != obj2.getClass()) return false;

    //Si son del mismo tipo procede a comparar sus propiedades y 
    //a hacer el casting.
    EnteroEnorme objaux = (EnteroEnorme) obj2;

    //Comparación de los campos si ambos devuelven verdadero son iguales.
    return Objects.equals(getEntero(), objaux.getEntero())
        && Objects.equals(getString(), objaux.getString());
}
Jbeltran
  • 766
  • 4
  • 15
Javi
  • 445
  • 2
  • 10
  • Encontré la solución https://es.stackoverflow.com/questions/225/cómo-comparar-correctamente-strings-y-objetos-en-java – Javi May 17 '20 at 15:02

2 Answers2

1

Debes sobre-escribir el método equals(Object o) de la clase donde deseas realizar la comparación, te dejo un ejemplo básico tu adaptas el método a las comparaciones que deseas integrar:

public class MyClase{
    public firstName;
    pubilc lastName;

    @Override
    public boolean equals(Object o) {

        /*Se compara la clase a si misma para verificar si es una copia exacta.
        si es una copia devuelve que son iguales*/
        if (this == o) return true;

        //Si el objeto pasado como párametro es null devuelve que no son iguales.
        if (o == null) return false;

        //Si no son del mismo tipo devuelve falso.
        if (getClass() != o.getClass()) return false;

        //Si son del mismo tipo procede a comparar sus propiedades y 
        //a hacer el casting.
        Person person = (Person) o;

        //Comparación de los campos si ambos devuelven verdadero son iguales.
        return Objects.equals(firstName, person.firstName)
            && Objects.equals(lastName, person.lastName);
    }
}

Para más referencias click aquí.

allexiusw
  • 792
  • 4
  • 15
  • 1
    allexiusw@ gracias, voy a testearlo a ver si funciona, que el equals sin sobresscribir fue la primera opción. – Javi May 17 '20 at 07:31
  • Me actualizas para saber si te funciona o seguimos revisando detalles especificos de tu código. – allexiusw May 17 '20 at 07:36
  • perdón, que andaba editando esto – Javi May 17 '20 at 07:49
  • He añadido el código de cómo está creada la clase en mi pregunta...creo, jaja. Básicamente como digo, la clase crea objetos con un array a partir de un String. Arriba por ejemplo he puesto que se creen dos objetos con "1" y quiero comparalos – Javi May 17 '20 at 07:59
  • En la clase `EnteroEnorme` debes agregar tu método `equal()` como se describe aquí. – allexiusw May 17 '20 at 08:06
  • Si, bueno, ya lo tenía agregado. No he puesto todos los métodos de la clase porque no vienen al caso. En realidad, antes de tratar los objetos me gustaría compararlos, tal y como son creados, justo después de su creación. A lo mejor he asignado las variables de forma errónea en el código que me has facilitado – Javi May 17 '20 at 08:10
  • Lo que estoy haciendo es crear un método que compare los String de los Objetos. Si son iguales, crear un nuevo String con el contenido del array de los objetos que quiera comparar y si ambos String tb son iguales, asignar true a la comparación de los objetos. Es decir, básicamente comparar cada uno de los datos de los objetos, pero creo que puede hacerse más sencillo – Javi May 17 '20 at 08:14
1

Para comparar objetos, estos objetos deben de implementar la interfaz Comparable, y utilizar el método sort.

El método sort se utiliza de la siguiente manera:

miObjeto1.sort(miObjeto2)

El método sort debes de sobre-escribirlo. y devuelve un número entero. Este número entero será negativo si miObjeto1.propiedad (usando normalmente método getter para acceder a propiedad) es menor que miObjeto2.propiedad. Devolverá un 0 si miObjeto1.propiedad==miObjeto2.propiedad. Devolverá un número positivo si miObjeto1.propiedad>miObjeto2.propiedad.

De esta manera, el método sort se puede personalizar según la propiedad que quieras comparar dentro de cada objeto. Ya sean los vatios de objetos bombillas, o numero de empleados de objetos oficina.

Jesús
  • 516
  • 2
  • 9