Java 我有两个arrayList<;myObject>;,I';我无法使用equals()来正确比较它们。为什么?

Java 我有两个arrayList<;myObject>;,I';我无法使用equals()来正确比较它们。为什么?,java,arraylist,equals,Java,Arraylist,Equals,我有两个arrayLists,其中myObject是我创建的自定义类的对象。我希望能够使用equals()方法比较这些ArrayList 在阅读并寻找答案之后,我了解到,某些对象(如int[])只有在引用同一对象时才被equals()方法视为相等 为了解决这个问题,我尝试在自定义对象中重写equals方法。我的对象有3个属性(所有基本类型),因此如果所有3个属性都等于所比较对象的属性,那么我的equals方法现在返回true,否则返回false。但是,比较ArrayList仍然不起作用。我做错了

我有两个
arrayLists
,其中
myObject
是我创建的自定义类的对象。我希望能够使用
equals()
方法比较这些ArrayList

在阅读并寻找答案之后,我了解到,某些对象(如
int[]
)只有在引用同一对象时才被
equals()
方法视为相等

为了解决这个问题,我尝试在自定义对象中重写equals方法。我的对象有3个属性(所有基本类型),因此如果所有3个属性都等于所比较对象的属性,那么我的equals方法现在返回
true
,否则返回false。但是,比较ArrayList仍然不起作用。我做错了什么

请原谅我解释代码而不是发布它,我这样做是因为变量和名称不是英文的

编辑:好的,这是代码
Compra
是我的自定义类
cantidad
concepto
id
是它的属性

@Override
    public boolean equals(Object obj) {
        boolean result = true;

        if (obj == null) {
            result = false;
        }else{
            Compra comprobada = (Compra) obj;
        if(!(this.id == comprobada.getId())){
        result = false;
       }
        if(!(this.cantidad == comprobada.getCantidad())){
        result = false;
       } if(!this.concepto.equals(comprobada.getConcepto())){
        result = false;
       }

        }
        return result;

    }

由于您尚未发布代码,我建议您检查方法
compareTo
,以及如何将其用于自定义类。

基于此方法:

如果您已经实现了自定义对象equals correct(您实际上覆盖了它并拥有了它),并且arrayList的大小相同,并且每对对象都相等,那么它将返回相等。换句话说,您试图做的是完全正确的,但是您的ArrayList实际上并没有以精确顺序包含完全相同的对象

通过执行System.out.println()来调查发生了什么,确保在检查集合相等性时调用了equal。 如果您不介意,请发送与您的对象相等的内容

我在一个单独的示例中运行您的代码,效果很好(outtputs true)——我改进了equals方法,这样它就不会执行太多if检查,因为如果其中只有一个不相等,那么它应该返回false

 class stackoverflow {
    public static void main(String args[]){
        ArrayList<Compra> array1 = new ArrayList<>();
        ArrayList<Compra> array2 = new ArrayList<>();
        array1.add(new Compra(1,2,"test"));
        array2.add(new Compra(1,2,"test"));
        System.out.println(array1.equals(array2));
   }
}
class Compra {
    int id;
    int cantidad;
    String concepto;

    public Compra(int id, int cantidad, String concepto){
        this.id = id;
        this.cantidad = cantidad;
        this.concepto = concepto;
    }



    public boolean equals(Object obj) {


        if (obj == null) {
             return false;
        }else{
             Compra comprobada = (Compra) obj;
             if(!(this.id == comprobada.getId())){
                   return false;
             }
             if(!(this.cantidad == comprobada.getCantidad())){
                   return false;
             } 
             if(!this.concepto.equals(comprobada.getConcepto())){
                   return false;
             }

        }
        return true;
    }



    public int getId() {
        return id;
    }




    public int getCantidad() {
        return cantidad;
    }




    public String getConcepto() {
        return concepto;
    }


}
类堆栈溢出{
公共静态void main(字符串参数[]){
ArrayList array1=新的ArrayList();
ArrayList array2=新的ArrayList();
增加(新的压缩(1,2,“测试”);
增加(新的压缩机(1,2,“测试”);
System.out.println(array1.equals(array2));
}
}
压缩级{
int-id;
内坎蒂达德;
字符串概念;
公共压缩(int-id,int-cantidad,String-concepto){
this.id=id;
this.cantidad=cantidad;
this.concepto=concepto;
}
公共布尔等于(对象obj){
if(obj==null){
返回false;
}否则{
Compra compobada=(Compra)obj;
如果(!(this.id==comprobada.getId()){
返回false;
}
如果(!(this.cantidad==comprobada.getCantidad()){
返回false;
} 
如果(!this.concepto.equals(comprobada.getConcepto())){
返回false;
}
}
返回true;
}
公共int getId(){
返回id;
}
公共int getCantidad(){
返回康蒂达;
}
公共字符串getConcepto(){
返回概念;
}
}
需要检查的内容:

  • 您确定不更改ArrayList中的顺序吗??:
  • 您是否打印以确保这些相等检查发生并按预期返回true或false
  • 您确定concepto字符串完全相同,大小写相同,不包含额外的空格等吗

你说“仍然不起作用”是什么意思?发布你的代码,你期望它做什么,以及它实际做什么。如果你对英语变量感到担忧,那么用英语写一篇SSCCE来演示这个问题。您的书面解释不足以让我们帮助您。@StephenCI更新了问题,添加了一些代码。这是我的equals方法,我尝试比较由这些对象组成的两个ArrayList,但结果不应该是false。如果
id
cantidad
concepto
是字符串,则需要使用
.equals()
,不
==
。请检查下面的答案,并告诉我您是否在代码中发现了使事情无法正常工作的内容;)-您的代码与我的示例运行良好嘿,感谢您花时间编写并尝试代码。我在比较时仍然得到错误。我非常确定这两个数组是相等的,因为它们都是通过读取同一个文件两次创建的。我正在调试一切,以防我遗漏了什么。什么错误?您可能正在传递不同类型的对象-确保这段代码不是bug所在的地方。有例外吗?