所以我的Program类中有一个函数:
public class Program {
IntegSet i1, i2, i3, i4;
i1 = new IntegSet();
i2 = new IntegSet(1,2,5);
i3 = new IntegSet();
i4 = new IntegSet(i2);
}
我的IntegSet类中有一个构造函数:
public class IntegSet{
private final int MAXALLOWEDSETVALUE=2000;
private boolean [] data = new boolean[MAXALLOWEDSETVALUE+1];
public IntegSet(int... elts) {
}
我的程序是关于制作整数集。我知道在我的Program类中,我正在创建对象,并在我的Set类中的Set函数中构造它们。但我不知道如何编码构造函数。我只能拥有那些成员变量。谢谢你的帮助。
编辑:我有第一个功能,我认为没问题。public IntegSet(int... elts) {
for(int iteration = 0; iteration < elts.length; iteration++) {
data[iteration] = true;
}
}
但是这个功能呢?
public IntSet(IntSet source){
this.data = source.data;
}
这是一个复制构造函数吗?我对它的运作方式有点困惑。它与这个功能有何不同:
public void setTo(IntSet source){}
我应该用它来称呼它:
i3.setTo(i3.subtract(i1))
答案 0 :(得分:1)
这里有一些评论。首先,如果您希望Set
类中的类级别的变量,您应该在static
之前添加它们。这些对于Program
类的任何实例都是相同的。您还需要在main
函数中或在声明它们的同一行中初始化这些静态变量。
public class Test {
static MySet i1, i2, i3, i4;
public static void main(String[] args) {
i1 = new MySet();
i2 = new MySet(1,2,5);
i3 = new MySet();
i4 = new MySet(i2);
}
}
关于您的Set
课程,我建议您不要将其命名为Set
,因为它会与java.util.Set
冲突。尝试MySet
之类的内容,如下所示。
public class MySet {
private final int MAXALLOWEDSETVALUE = 2000;
private boolean[] data;
public MySet(int... elts) {
data = new boolean[MAXALLOWEDSETVALUE + 1];
for (int eltNdx = 0; eltNdx < elts.length; eltNdx++) {
if (elts[eltNdx] <= MAXALLOWEDSETVALUE) { //Prevent ArrayIndexOutOfBoundsException
data[elts[eltNdx] + 1] = true;
} else {
//Above the maximum size. Either don't store or handle accordingly.
}
}
}
public MySet(MySet anotherSet) {
System.arraycopy(anotherSet.data, 0, this.data, 0, MAXALLOWEDSETVALUE);
}
}
我将构造函数中的作业调整为上面的data[elts[eltNdx] + 1]
,以便通过0
为值+ 1
留下一个点。我也错误地使用eltNdx索引数据数组而不是值(现在修复并测试)。
您包含的构造函数将起作用,但您应该验证elts
中的值不会超过允许的最大值,因为您将它们保存在集合中。这就是我在if (elts[eltNdx] <= MAXALLOWEDSETVALUE)
的解决方案中所做的。
对于接受另一个IntSet
的构造函数,最初发布的代码使两个对象共享数据数组。这不是java.util.Set
的工作原理,所以我调整了构造函数,将anotherSet
的数据数组的值复制到正在构造的对象的数据数组中。
以下是java.util.Set
工作方式的示例:
Set<Integer> set1 = new HashSet<>();
set1.add(10);
set1.add(11);
Set<Integer> set2 = new HashSet<>(set1);
System.out.println("Initial set 1:\n" + set1);
System.out.println("set2 constructed with set1:\n" + set2);
set1.add(12);
System.out.println("Adjusted set1 with 12:\n" + set1);
System.out.println("set2 after set1 adjustment:\n" + set2);
输出:
Initial set 1:
[10, 11]
set2 constructed with set1:
[10, 11]
Adjusted set1 with 12:
[10, 11, 12]
set2 after set1 adjustment:
[10, 11]
请注意,在构建set1
之后,向set2
添加12不会影响set2
。这是因为它们在内部由单独的数据结构表示。
使用调整后的(当前)代码,我们可以观察到相同的行为。 (我添加了一个getData()方法,它只返回数据数组,因为它是私有的)
i1 = new IntegSet(0, 2);
i2 = new IntegSet(i1);
System.out.println("i1: " + Arrays.toString(i1.getData()));
System.out.println("i2: " + Arrays.toString(i2.getData()));
i1.getData()[2] = false;
System.out.println("i1: " + Arrays.toString(i1.getData()));
System.out.println("i2: " + Arrays.toString(i2.getData()));
输出:
i1: [true, false, true, false]
i2: [true, false, true, false]
i1: [true, false, false, false]
i2: [true, false, true, false]
将i1
的值2
设置为false
不会影响i2
。请注意,这是您在构造后修改集合的方法。
我假设您提到的setTo(IntSet source)
函数应该完全使用System.arrayCopy作为构造函数(重构数据数组)。