Java 将ArrayList与contain对象进行比较
我有我的对象类:Java 将ArrayList与contain对象进行比较,java,list,Java,List,我有我的对象类: 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<
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));
ArrayList myFirstList=新建ArrayList();
ArrayList mySecondList=新建ArrayList();
添加(新测试(“a”,1,false));
添加(新测试(“b”,2,false));
添加(新测试(“c”,3,false));
add(新测试(“a”,1,false));
add(新测试(“b”,2,false));
add(新测试(“c”,3,false));
现在我需要检查这些数组列表是否包含内部具有相同字段的对象;除了使用fori循环和获取每个参数进行比较之外,还有其他方法吗?如果您在我们的类中重写
equals()
,您应该能够使用myFirstList.sort()
对两个列表进行排序,然后使用
myFirstList.equals(mySecondList)
如果在我们的类中重写equals()
,您应该能够使用myFirstList.sort()
对两个列表进行排序,然后只需使用
myFirstList.equals(mySecondList)
这与ArrayList无关,它与您的测试类相关。正如@VGR所说,为了知道测试类的两个对象是否具有相同的字段,您必须在测试类中重写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);
显然,要在两个ArrayList中搜索相等的对象,必须循环遍历第一个列表中的每个对象,然后将该对象与第二个列表中的所有对象进行比较,或者实现自己的算法。这就是使用数据结构和算法的地方 这与ArrayList无关,它与您的测试类有关。正如@VGR所说,为了知道测试类的两个对象是否具有相同的字段,您必须在测试类中重写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);
显然,要在两个ArrayList中搜索相等的对象,必须循环遍历第一个列表中的每个对象,然后将该对象与第二个列表中的所有对象进行比较,或者实现自己的算法。这就是使用数据结构和算法的地方 记录
显然,您希望通过检查每个成员字段的内容来比较同一类的对象是否相等
您可以通过使用自动获取该行为。这个特性在Java16中是新的,现在可以使用早期的access构建。在记录中,只需声明成员字段。编译器隐式地创建构造函数、getter、equals
&hashCode
和toString
因此,您无需使用自己的实现覆盖equals
,如其他答案所示
在类的主要目的是永久和透明地传输数据的情况下使用记录。相反,如果您的类关注封装数据的行为,或者使用其他OOP特性(如继承),那么您应该使用常规类,而不是记录
因此,您的代码:
公共类测试{
私有字符串名称;
私有int-id;
私有布尔aBoolean;
公共测试(字符串名、整数id、布尔aBoolean){
this.name=名称;
this.id=id;
this.aBoolean=aBoolean;
}
…变成:
公共记录测试(字符串名、int-id、布尔aBoolean){
使用该记录:
testx=新测试(“Alice”,42,真);
测试y=新测试(“Alice”,42,假);
布尔值same=x.equals(y);//由于第三个字段而为false。
比较列表
用于查看两个列表是否包含相同顺序的相等元素
List x=List.of(
新测试(“Alice”,1,正确),
新测试(“Bob”,2,正确),
新测试(“卡罗尔”,3,正确)
);
列表y=List.of(
新测试(“Alice”,1,正确),
新测试(“Bob”,2,正确),
新测试(“卡罗尔”,3,正确)
);
布尔值same=x.equals(y);//真。
记录
显然,您希望通过检查每个成员字段的内容来比较同一类的对象是否相等
您可以通过使用自动获得该行为。此功能在Java 16中是新功能,现在可以使用早期access生成。在记录中,您只需声明成员字段。编译器隐式创建构造函数、getter、equals
&hashCode
和toString
因此,您无需使用自己的实现覆盖equals
,如其他答案所示
如果类的主要目的是不可变和透明地传输数据,则使用记录。相反,如果类关注封装数据的行为,或使用其他OOP功能(如继承),则应使用常规类,而不是记录
因此,您的代码:
公共类测试{
私有字符串名称;
私有int-id;
私有布尔aBoolean;
公共测试(字符串名、整数id、布尔aBoolean){
this.name=名称;
this.id=id;
this.aBoolean=aBoolean;
}
…变成:
公共记录测试(字符串名、int-id、布尔aBoolean){
使用该记录:
testx=新测试(“Alice”,42,真);
测试y=新测试(“Alice”,42,假);
布尔值same=x.equals(y);//由于第三个字段而为false。
比较列表
用于查看两个列表是否包含相同顺序的相等元素
List x=List.of(
新测试(“Alice”,1,正确),
新测试(“Bob”,2,正确),
新测试(“卡罗尔”,3,正确)
);
列表y=List.of(
新测试(“Alice”,1,正确),
新测试(“Bob”,2,正确),
新测试(“卡罗尔”,3,正确)
);
布尔值same=x.equals(y);//真。
您是否在类中重写equals
?您可以在测试类中编写比较方法,但是,是的,您的其他代码仍然必须在两个列表中循环。如果