【问题标题】:Java: Implementing equals method for comparing two double[][] arraysJava:实现用于比较两个 double[][] 数组的 equals 方法
【发布时间】:2012-01-15 11:12:31
【问题描述】:

我正在尝试在我的班级中实现 equals 方法.. 注意:'_data' 属性是一个 double[][] 数组,我试图在两个对象之间进行比较。

无论如何它都能编译,但我总是得到一个错误的答案,这不可能是因为两个数组是相同的:o

我做错了吗?还有其他简单的方法吗? (仅使用对象类中的等号!!)

我的代码(JAVA):

public boolean equals(Object obj) {
    if (!(obj instanceof MyClass)) {
        return false;
    }

    MyClass myObj = (MyClass) obj;
    return this._data.equals(myObj._data);
}

【问题讨论】:

  • 您必须粘贴更大的代码 sn-p。现在很难判断是什么导致了问题。
  • 出于调试目的,请您执行MyClass mc1 = new MyClass(); MyClass mc2 = mc1; boolean toCheck = mc1.equals(mc2);Does toCheck == true 之类的操作吗?
  • Tomasz Nurkiewicz - 我不能使用你建议的方法,我只要求实现 equals 方法..
  • 我确定如果你使用equals它和使用==是一样的,也就是说,只比较它们是否是相同的实例(相同的引用),而不是它们是否具有相同的内容。测试它:int[] a = { 1 }; int[] b = { 1 }; System.out.println(a.equals(b));

标签: java arrays object equals


【解决方案1】:

使用

Arrays.deepEquals(this._data, myObj._data) 

对数组进行测试。

【讨论】:

  • 谢谢,但我只使用equals方法询问..(不是array.equals())
  • 说真的,当三个人告诉你以标准库中内置的某种方式来做,而你基于“我不能使用那个”而反对它时,你需要证明为什么不这样做。
  • 如果您不想使用标准库,请在两个维度上进行循环迭代。但这太可怕了。
【解决方案2】:

使用Arrays.deepEquals(data, myObj._data)

【讨论】:

  • 谢谢,但我只使用equals方法询问..(不是array.equals())
【解决方案3】:

你可以看看这篇描述deepEquals方法的帖子:Java Arrays.equals() returns false for two dimensional arrays

【讨论】:

  • 谢谢,但我只使用equals方法询问..(不是array.equals())
【解决方案4】:

我会覆盖 MyClass 类中的 equals 方法。

@Override
public boolean equals(Object obj) {//if you insist in using an Object as argument instead of double[][]
   if (!(obj instanceof MyClass)) {
      return false;
   }

   MyClass myObj = (MyClass) obj;
   if(_data.length == myObj._data.length){
      for(int i=0; i<_data.length; i++){
         if(_data[i].length == myObj._data[i].length){
            for(int j=0; j<_data[i].length; j++){
               if(_data[i][j] != myObj._data[i][j]){
                  return false;
               }
            }
         }else{
            return false;
         }
      }
   }else{
      return false;
   }
   return true;
}

此代码考虑了您将拥有一个二维数组而不是方阵的情况。即第一行有三个元素,第二行有27个元素,第三行有N个元素...... 比如一个测试用例:

    double[][] first= new double[5][3];
    double[][] second= new double[5][3];
    for(int i=0; i<first.length; i++){
        for(int j=0; j<first[i].length; j++){
            first[i][j] = 5;
        }
    }
    for(int i=0; i<second.length; i++){
        for(int j=0; j<second[i].length; j++){
            second[i][j] = 5;
        }
    }
    second[4][2] = 2;

    MyClass c1 = new MyClass(first);
    MyClass c2 = new MyClass(second);

    System.out.println("Equals: "+c1.equals(c2));

【讨论】:

    【解决方案5】:

    Joshua Bloch 在“Effective Java”的chapter 3 中告诉您如何实现 equals 和 hashCode(它们必须串联完成)。这应该告诉你所有你需要知道的,以便为你的类覆盖 equals。

    【讨论】:

    • 我相信问题不在于实现equals,而是如何比较数组,主要是为什么equals 方法不适用于数组!
    • 我认为这是关于如何覆盖 OP 类中的 equals 以便它可以使用数组数据成员进行比较。这不正确吗? “我正在尝试在我的班级中实现 equals 方法......” - 至于原因,很明显:equals 仅在未被覆盖时才执行“浅等于”。
    • 对于 OP 来说并不那么明显,考虑到他的评论“......我非常肯定我可以将这些数组与 'equals' 进行比较......”,但我可能错了。实际上,我认为它小于而不是“浅等于”——他只是在比较参考。
    • 这就是我所说的“浅等于”。深度相等将确保数组的长度相同并且所有元素都相同。双打会更难;你能做的最好的就是说它们都在彼此的 epsilon 误差之内。
    猜你喜欢
    • 2018-04-28
    • 2011-04-26
    • 1970-01-01
    • 2019-08-22
    • 2016-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多