使用equals方法检查两个整数子集是否相等

时间:2012-11-22 00:40:37

标签: java

我在类中使用了这个名为IntArray的java方法。该类具有向集合中添加整数或从集合中移除整数,检查集合大小以及检查2个集合是否相等的方法。使用2个不同的IntArray类型的对象在main中创建2个集合,比如对象A和B. equals方法应该检查两组整数是否相等。例如,集合A = {1,2,3}和B = {1,2,3,4}。即使一个集合是另一个集合的子集,该方法仍然返回true。究竟我做错了什么?感谢。

//part of the code in main
IntArray A = new IntArray();
IntArray B = new IntArray();
if(A.equals(B))
System.out.println("A and B are equal");



 //equals method in IntArray class
 public boolean equals(Object b)
 {
  if (b instanceof IntArray)
    {
      IntArray A = (IntArray) b;
      for (int i = 0; i < data.length; i++)
      if (countOccurrences(data[i]) != A.countOccurrences(data[i]))
      return false;
      return true;
    }
 else return false;  
}

3 个答案:

答案 0 :(得分:3)

 if (countOccurrences(data[i]) != A.countOccurrences(data[i]))

可能是

 if (countOccurrences(data[i]) != A.countOccurrences(A.data[i]))

编辑:

如果通过等于设置,则表示子集中的每个元素的顺序相同(A = {1,2,3},B = {1,2,3}):

然后,您想使用equals方法检查两个整数子集是否相等:

if (data[i].equals(A.data[i]));

当两者具有相同的长度时,确保仅比较两组。否则,返回false。

如果您对equals set的定义意味着两个具有相同元素的集合,而不考虑其位置

你应该检查你是否计算过这样的事情:

public int countOccurrences(int element) 
{
     int count = 0;
     for(int i = this.data.length - 1; i >= 0; i--) 
        if(this.data[i] == element) 
          count ++;
    return count;
}

在后一种情况下,您应该保留if (countOccurrences(data[i]) != A.countOccurrences(data[i]))

答案 1 :(得分:1)

预先检查两个列表的长度是否相同。如果它们的长度不同,则返回false。如果它们的长度相同,则进行逐元素比较。

答案 2 :(得分:1)

这是所述问题的解决方案。请注意,它假定IntArray对象表示真实集,而不是包/多集。它假设data数组中的值是有序的。

public boolean equals(Object otherObject) {
    if (otherObject == this) {  
        // This is an optimization for the case where an object
        // is compared with itself
        return true;
    } else if (otherObject instanceof IntArray) {
        IntArray other = (IntArray) other;
        if (this.data.length != other.data.length) {
            // If the sets have different nos of elements they cannot be equal
            return false;
        }
        for (int i = 0; i < this.data.length; i++) {
            boolean found = false;
            for (int j = 0; j < this.data.length; j++) {
                if (this.data[i] == other.data[j]) {
                    found = true;
                    break;
                }
            }
            if (!found) {
                return false;
            }
        }
        return true;
    } else {
        return false;
    }
}

如果要订购data数组保证,那么您可以进行简单的元素逐元素比较。用以下代码替换上面代码中的for循环:

        for (int i = 0; i < this.data.length; i++) {
            if (this.data[i] != other.data[i]) {
                return false;
            }
        }

最后,这是多套案例的解决方案;即this.data的元素在数组中不一定是唯一的:

public boolean equals(Object otherObject) {
    if (otherObject == this) {  
        return true;
    } else if (otherObject instanceof IntArray) {
        IntArray other = (IntArray) other;
        if (this.data.length != other.data.length) {
            return false;
        }
        for (int i = 0; i < this.data.length; i++) {
            if (this.count(this.data[i]) != other.count(this.data[i]) {
                return false;
            }
        }
        return true;
    } else {
        return false;
    }
}

public int count(int x) {
    int count = 0;
    for (int y : this.data) {
        if (x == y) {
            count++;
        }
    }
    return count;
}

请注意,它是

  if (this.count(this.data[i]) != other.count(this.data[i]) {

而不是

  if (this.count(this.data[i]) != other.count(other.data[i]) {

因为我们想要计算相同值的出现次数...而不是相应位置的值的出现次数(可能不同值!)