我有我的object类:
public class Test {
private String name;
private int id;
private boolean aBoolean;
public Test(String name, int id, boolean aBoolean) {
this.name = name;
this.id = id;
this.aBoolean = aBoolean;
}和此对象的2个arrayList:
ArrayList<Test> myFirstList = new ArrayList<>();
ArrayList<Test> mySecondList = new ArrayList<>();
myFirstList.add(new Test("a", 1, false));
myFirstList.add(new Test("b", 2, false));
myFirstList.add(new Test("c", 3, false));
mySecondList.add(new Test("a", 1, false));
mySecondList.add(new Test("b", 2, false));
mySecondList.add(new Test("c", 3, false));现在我需要检查这些数组列表是否包含具有相同字段的对象;除了使用fori循环和获取每个参数进行比较之外,还有其他方法吗?
发布于 2021-02-08 03:04:55
记录
显然,您希望通过检查每个成员字段的内容来比较同一类的对象是否相等。
您可以通过使用records feature自动获取该行为。这个特性是Java16中的新特性,现在可以使用早期访问构建。在记录中,您只需声明成员字段。编译器隐式地创建构造函数、getters、equals & hashCode和toString。
因此,您不需要像在其他答案中看到的那样,使用您自己的实现覆盖equals。
如果一个类的主要目的是以不可变且透明的方式携带数据,则使用该记录。相反,如果您的类侧重于具有封装数据的行为,或者使用其他OOP特性,例如继承,那么您应该使用常规类,而不是记录。
所以你的代码:
public class Test {
private String name;
private int id;
private boolean aBoolean;
public Test(String name, int id, boolean aBoolean) {
this.name = name;
this.id = id;
this.aBoolean = aBoolean;
}…变成:
public record Test ( String name , int id , boolean aBoolean ) {}使用该记录:
Test x = new Test ( "Alice" , 42 , true ) ;
Test y = new Test ( "Alice" , 42 , false ) ;
boolean same = x.equals( y ) ; // false because of third field.比较列表
使用List#equals查看两个列表是否包含相同顺序的相等元素。
List x = List.of(
new Test ( "Alice" , 1 , true ) ,
new Test ( "Bob" , 2 , true ) ,
new Test ( "Carol" , 3 , true )
);
List y = List.of(
new Test ( "Alice" , 1 , true ) ,
new Test ( "Bob" , 2 , true ) ,
new Test ( "Carol" , 3 , true )
);
boolean same = x.equals( y ) ; // True. 发布于 2021-02-08 00:58:51
如果在我们的类中覆盖equals(),您应该能够使用myFirstList.sort()对两个列表进行排序,然后只使用myFirstList.equals(mySecondList)
发布于 2021-02-08 02:57:07
这与ArrayList无关,它与您的测试类相关。正如@VGR所说,为了知道Test类的两个对象是否具有相同的字段,您必须覆盖Test类中的equals方法,如下所示:
public class Test {
// your constructors and methods
@Override
public boolean equals(Object o) {
if (o == this) {
return true;
}
if (!(o instanceof Test)) {
return false;
}
Test t = (Test) o;
// Compare the data members and return accordingly
return this.name.equals(t.name)
&& this.id == t.id;
&& this.aBoolean == t.aBoolean;
}
}现在,要检查ArrayList中的两个对象是否相等,只需执行以下操作:
boolean result = myFirstList.get(indexOfObject1).equals(indexOfObject2);
System.out.println("Result : "+result);显然,要在两个ArrayLists中搜索相等的对象,您必须遍历第一个列表中的每个对象,然后将该对象与第二个列表中的所有对象进行比较,或者实现您自己的算法。这就是使用数据结构和算法的地方!
https://stackoverflow.com/questions/66090516
复制相似问题