我在类中使用了这个名为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;
}
答案 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]) {
因为我们想要计算相同值的出现次数...而不是相应位置的值的出现次数(可能不同值!)