2

我在名为 IntArray 的类中有这个 java 方法。该类具有将整数添加到集合或从集合中删除整数、检查集合的大小以及检查 2 个集合是否相等的方法。这 2 个集合是在 main 中使用 2 个不同类型的 IntArray 对象创建的,比如说对象 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;  
}
4

3 回答 3

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]));

确保仅在两个集合具有相同长度时才比较这两个集合。否则,返回假。

如果您对 equals set 的定义意味着两个具有相同元素的集合,而与它们的位置无关

您应该检查 countOccurrences 是否正在执行以下操作:

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])).

于 2012-11-22T00:43:34.467 回答
1

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

于 2012-11-22T00:46:18.947 回答
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]) {

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

于 2012-11-22T10:49:21.193 回答