cómo comparar dos objetos que contienen cada tipo primitivo y recogida de objetos en Java?

praxnet:

Tengo dos DTO objetos como seguir, por favor, nota que estoy usando Lombok a evitar código repetitivo.

dtoa

import lombok.Data;
import java.util.List;

@Data
public class DtoA {

    private String name;
    private String number;
    private List<String> aList;
}

DtoB

import lombok.Data;
import java.util.List;

@Data
public class DtoB {
    private String name;
    private String phone;
    private List<String> bList;
}

Quiero comparar campos específicos de ambos objetos por lo que he creado una especie de adaptador de objeto como siguiente

DtoAdapter

import lombok.Data;
import java.util.List;

@Data
public class DtoAdapter {
    private String nameText;
    private List<String> xList;
}

Lo que sigue es mi clase de prueba con el método principal, donde estoy tratando de hacer la comparación Esta comparación está fallando debido a aList y ListaB contiene cadenas en diferentes órdenes. Quiero comparar el contenido de la lista sin tener que preocuparse por su orden.

Prueba

import junit.framework.Assert;
import java.util.ArrayList;
import java.util.List;

public class Test {
    public static void main(String[] args) {
        DtoA a = new DtoA();
        List<String> aList = new ArrayList<>();
        aList.add("x"); aList.add("y"); aList.add("z");
        a.setName("abc"); a.setNumber("123"); a.setAList(aList);

        DtoB b = new DtoB();
        List<String> bList = new ArrayList<>();
        bList.add("z"); bList.add("x"); bList.add("y");
        b.setName("abc"); b.setPhone("123"); b.setBList(bList);

        DtoAdapter a1 = new DtoAdapter();
        a1.setNameText(a.getName()); a1.setXList(a.getAList());

        DtoAdapter b1 = new DtoAdapter();
        b1.setNameText(b.getName()); b1.setXList(b.getBList());

        // comparision failing because of lists contains string in different orders
        Assert.assertEquals(a1, b1);
    }
}

Nota: He tratado de escribir compareTo (mediante la implementación de la interfaz similar a la clase DtoAdapter) Pero no pude escribir comparación de dos listas con el método compareTo como seguir

DtoAdapter con interfaz comparable

import lombok.Data;
import java.util.List;

@Data
public class DtoAdapter implements Comparable<DtoAdapter>{
    private String nameText;
    private List<String> xList;

    @Override
    public int compareTo(DtoAdapter o) {
        return this.getNameText().compareTo(o.getNameText());
        // how to compare this.getXList() and o.getXList() with compareTo?
    }
}
también:

Lo que se busca con interés no está extendiendo una Comparablesino una overriden equalsimplementación de la clase (junto con hashcode, por supuesto).

@Override
public boolean equals(Object o) {
    if (this == o) return true;
    if (o == null || getClass() != o.getClass()) return false;
    DtoAdapter that = (DtoAdapter) o;
    // following line of code specifically
    return Objects.equals(nameText, that.nameText) &&
            that.getXList().containsAll(xList) && xList.containsAll(that.getXList());
}

Además de la documentación de Comparablela interfaz se utiliza principalmente para los elementos de pedido y no para la comparación de igualdad:

Esta interfaz impone un orden total en los objetos de cada clase que lo implementa. Este orden se conoce como la clase de la ordenación natural, y de la clase de compareTométodo se conoce como método de comparación naturales .

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=312169&siteId=1
Recomendado
Clasificación