【问题标题】:I have two arrayList<myObject>, I'm not able to use equals() to be able to compare them correctly. Why?我有两个 arrayList<myObject>,我无法使用 equals() 来正确比较它们。为什么?
【发布时间】:2014-10-18 23:40:46
【问题描述】:

我有两个arrayLists&lt;myObject&gt;,其中myObject 是我创建的自定义类的对象。我希望能够使用equals() 方法比较这些数组列表。

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

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

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

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

@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;

    }

【问题讨论】:

  • 你是什么意思,“仍然不起作用”?发布您的代码、您期望它做什么以及它实际做什么。
  • 如果你担心英文变量,那么写一个SSCCE 用英文来演示这个问题。您的书面解释不足以让我们为您提供帮助。
  • @StephenCI 更新了问题以包含一些代码。那是我的 equals 方法,我尝试比较由这些对象组成的两个数组列表,但结果不应该是错误的。
  • 如果idcantidadconcepto是字符串,那么你需要使用.equals(),而不是==
  • 在下面查看我的答案,并告诉我您是否在代码中发现了一些使事情无法正常工作的内容;) - 您的代码在我的示例中运行良好

标签: java arraylist equals


【解决方案1】:

基于此: How can I check if two ArrayList differ, I don't care what's changed

如果你已经实现了你的自定义对象 equals 是正确的(你实际上覆盖了它并拥有你的)并且 arrayList 的大小是相同的并且每个对象对都相等,那么它将返回相等。换句话说,您尝试做的事情是完全正确的,但您的 arrayLists 实际上并没有以 exact order 完全相同的对象。

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

我在一个孤立的示例中运行您的代码并且工作正常(输出为 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;
    }


}

需要检查的一些事项:

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

【讨论】:

  • 您好,感谢您花时间编写和尝试代码。比较时我仍然收到错误消息。我很确定这两个数组是相等的,因为它们都是通过两次读取同一个文件而创建的。我正在调试所有内容,以防我错过了什么。
  • 什么错误?您可能正在传递不同类型的对象? - 确保此代码不是错误所在。有例外吗?
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-06
    • 1970-01-01
    相关资源
    最近更新 更多