首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将ArrayList与contain进行比较

将ArrayList与contain进行比较
EN

Stack Overflow用户
提问于 2021-02-08 00:54:15
回答 3查看 67关注 0票数 1

我有我的object类:

代码语言:javascript
复制
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:

代码语言:javascript
复制
 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循环和获取每个参数进行比较之外,还有其他方法吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2021-02-08 03:04:55

记录

显然,您希望通过检查每个成员字段的内容来比较同一类的对象是否相等。

您可以通过使用records feature自动获取该行为。这个特性是Java16中的新特性,现在可以使用早期访问构建。在记录中,您只需声明成员字段。编译器隐式地创建构造函数、getters、equals & hashCodetoString

因此,您不需要像在其他答案中看到的那样,使用您自己的实现覆盖equals

如果一个类的主要目的是以不可变且透明的方式携带数据,则使用该记录。相反,如果您的类侧重于具有封装数据的行为,或者使用其他OOP特性,例如继承,那么您应该使用常规类,而不是记录。

所以你的代码:

代码语言:javascript
复制
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;
}

…变成:

代码语言:javascript
复制
public record Test ( String name , int id , boolean aBoolean ) {}

使用该记录:

代码语言:javascript
复制
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查看两个列表是否包含相同顺序的相等元素。

代码语言:javascript
复制
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. 
票数 3
EN

Stack Overflow用户

发布于 2021-02-08 00:58:51

如果在我们的类中覆盖equals(),您应该能够使用myFirstList.sort()对两个列表进行排序,然后只使用myFirstList.equals(mySecondList)

票数 1
EN

Stack Overflow用户

发布于 2021-02-08 02:57:07

这与ArrayList无关,它与您的测试类相关。正如@VGR所说,为了知道Test类的两个对象是否具有相同的字段,您必须覆盖Test类中的equals方法,如下所示:

代码语言:javascript
复制
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中的两个对象是否相等,只需执行以下操作:

代码语言:javascript
复制
    boolean result = myFirstList.get(indexOfObject1).equals(indexOfObject2);
    System.out.println("Result : "+result);

显然,要在两个ArrayLists中搜索相等的对象,您必须遍历第一个列表中的每个对象,然后将该对象与第二个列表中的所有对象进行比较,或者实现您自己的算法。这就是使用数据结构和算法的地方!

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66090516

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档