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
?您可以在测试类中编写比较方法,但是,是的,您的其他代码仍然必须在两个列表中循环。如果