Как сравнить объекты из одного класса на основе их атрибутов? - PullRequest
0 голосов
/ 26 октября 2018

У меня есть следующие объекты:

COSTOS Costos = new COSTOS(1781, 359.13, "BISAG.SUP.PUER.TRA.I", "67550T9AT00ZZ");
        COSTOS Herramienta = new COSTOS(1795, 299.11, "BISAG.INF.PUER.TRA.I", "67960T2MT02ZZ");

А это мой класс:

public class COSTOS implements Comparable<COSTOS>{

    public int referencia;
    public double monto;
    public String descripcion;
    public String NumeroParte;

    //Constructor


    //getters setters

Кроме того, я реализовал HashCode и равен:

@Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((NumeroParte == null) ? 0 : NumeroParte.hashCode());
        result = prime * result + ((descripcion == null) ? 0 : descripcion.hashCode());
        long temp;
        temp = Double.doubleToLongBits(monto);
        result = prime * result + (int) (temp ^ (temp >>> 32));
        result = prime * result + referencia;
        return result;
    }
    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        COSTOS other = (COSTOS) obj;
        if (NumeroParte == null) {
            if (other.NumeroParte != null)
                return false;
        } else if (!NumeroParte.equals(other.NumeroParte))
            return false;
        if (descripcion == null) {
            if (other.descripcion != null)
                return false;
        } else if (!descripcion.equals(other.descripcion))
            return false;
        if (Double.doubleToLongBits(monto) != Double.doubleToLongBits(other.monto))
            return false;
        if (referencia != other.referencia)
            return false;
        return true;
    }

Как я могу реализовать метод, который мог бы печатать все атрибуты которые не равны?

Я пытался использовать "import java.util.Objects;" использовать: "Objects.hash (referencia, monto, descripcion, NumeroParte);", так что это может дать мне результаты для печати

Ответы [ 2 ]

0 голосов
/ 26 октября 2018

Во-первых, ваши методы могут быть упрощены с помощью нулевых безопасных Objects вспомогательных методов, добавленных в Java 7:

@Override
public int hashCode() {
    final int prime = 31;
    int result = 1;
    result = prime * result + Objects.hashCode(this.NumeroParte);
    result = prime * result + Objects.hashCode(this.descripcion);
    result = prime * result + Double.hashCode(this.monto);
    result = prime * result + this.referencia;
    return result;
}

@Override
public boolean equals(Object obj) {
    if (this == obj)
        return true;
    if (obj == null || getClass() != obj.getClass())
        return false;
    COSTOS other = (COSTOS) obj;
    return (Objects.equals(this.NumeroParte, other.NumeroParte)
         && Objects.equals(this.descripcion, other.descripcion)
         && Double.doubleToLongBits(this.monto) == Double.doubleToLongBits(other.monto)
         && this.referencia == other.referencia);
}

Как я могу реализовать методкоторые могут печатать все атрибуты, которые не равны?

Чтобы распечатать различия, выполните те же сравнения, что и метод equals:

public void printDifferences(COSTOS other) {
    if (! Objects.equals(this.NumeroParte, other.NumeroParte))
        System.out.println("Different NumeroParte: " + this.NumeroParte + " != " + other.NumeroParte);
    if (! Objects.equals(this.descripcion, other.descripcion))
        System.out.println("Different descripcion: " + this.descripcion + " != " + other.descripcion);
    if (Double.doubleToLongBits(this.monto) != Double.doubleToLongBits(other.monto))
        System.out.println("Different monto: " + this.monto + " != " + other.monto);
    if (this.referencia != other.referencia)
        System.out.println("Different referencia: " + this.referencia + " != " + other.referencia);
}
0 голосов
/ 26 октября 2018

Если я правильно понимаю ваше требование, вы хотите распечатать значения атрибутов, которые не совпадают в двух объектах, тогда вы можете создать метод следующим образом.

public void compareAttributes(COSTOS other) {
    if (this.getMonto() != other.getMonto()) {
       System.out.println("Not equal. This obj : " + this.getMonto() 
                        + " Other obj : " + other.getMonto());
    }

    // you can do the same for the remaining attributes.
}

EDIT:

Как отметил @Andreas, в комментариях вы должны поместить этот метод в свой класс COSTOS, чтобы можно было легко сравнивать каждый объект.

...