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?
}
}
Lo que se busca con interés no está extendiendo una Comparable
sino una overriden equals
implementació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 Comparable
la 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
compareTo
método se conoce como método de comparación naturales .