gpt4 book ai didi

java - 如何比较java中各自包含原始类型和对象集合的两个对象?

转载 作者:行者123 更新时间:2023-12-02 09:02:56 25 4
gpt4 key购买 nike

我有两个如下所示的 DTO 对象,请注意,我使用 lombok 来避免样板代码。

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;
}

我想比较两个对象的特定字段,因此我创建了一个适配器类型的对象,如下所示

Dto适配器

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

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

以下是我的测试类,其中包含主要方法,我试图进行比较此比较失败,因为 aList 和 bList 包含顺序不同的字符串。我想比较列表的内容而不用担心它们的顺序。

测试

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);
}
}

注意:我尝试编写compareTo(通过在DtoAdapter类中实现可比较的接口(interface))但我无法使用 CompareTo 方法编写两个列表的比较,如下所示

具有类似接口(interface)的 DtoAdapter

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?
}
}

最佳答案

您期待的不是扩展一个Comparable,而是一个重写的equals 类实现(当然还有hashcode) .

@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());
}

根据Comparable的文档,该接口(interface)主要用于对元素进行排序,而不是用于相等比较:

This interface imposes a total ordering on the objects of each class that implements it. This ordering is referred to as the class's natural ordering, and the class's compareTo method is referred to as its natural comparison method.

关于java - 如何比较java中各自包含原始类型和对象集合的两个对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58341380/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com