在一项任务中,我需要将两个集合(整数数组)联合起来,但是由于某些原因我得到了错误的输出......
这是类集的属性:
private int []set;
private int counter;
private int max = 10;
这是我用来获取数字的构造函数(我需要使用varags,因为我需要能够更改集合中元素的数量):
public Set (int...numbers) {
set = new int[max];
counter = 0;
for (int i = 0; i < numbers.length; i++) {
if (!this.isMember(numbers[i])) {
this.set[this.counter] = numbers[i];
this.counter++;
}
}
}
这是联合方法:
public Set union (Set setToUnion) {
Set setToReturn;
if (this.equals(setToUnion)){
setToReturn = new Set(setToUnion);
return setToReturn;
}
setToReturn = new Set(this.set);
for (int i = 0; i < setToUnion.counter; i++) {
if (!setToReturn.isMember(setToUnion.set[i])) {
setToReturn.set[setToReturn.counter ] = setToUnion.set[i];
setToReturn.counter++;
}
}
return setToReturn;
}
如果你想看看isMember在这里看起来如何(只是检查一些数字是否是其他集合的成员):
public boolean isMember (int n) {
if (isEmpty()) {
return false;
}
for (int i = 0; i < this.counter; i++) {
if (n == this.set[i]) {
return true;
}
}
return false;
}
现在在程序中我创建了两个这样的集合:
Set someSet = new Set(1,2,3,4,5);
Set anotherSet = new Set(2,6,7,8,9);
Set m = someSet.union(anotherSet);
m.show();
但我得到的输出是(1,2,3,4,5,0,6,7,8,9),我需要相同但中间没有0 ......
请帮忙 谢谢!
答案 0 :(得分:5)
问题似乎是union方法中的这一行:
setToReturn = new Set(this.set);
应该是:
setToReturn = new Set(this);
为什么会导致问题?
此时,this.set
等于[1, 2, 3, 4, 5, 0, 0, 0, 0, 0]
,这是一个int数组。因此,将调用以下构造函数:
public Set (int...numbers) { ... }
这意味着将添加数组中的所有数字,包括零。您需要通过执行类似...
的操作来截断数组中的零setToReturn = new Set( Arrays.copyOf( set, counter ) );
或者有一个接受Set
的构造函数。这样您就可以访问counter
以查看数组中有多少数字实际上是Set
的一部分。我猜你已经拥有了那个构造函数,它基于调用这样一个构造函数的代码的另一部分。