带有VarArgs的Java对象构造函数

时间:2017-03-09 02:19:45

标签: java object

所以我的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))

1 个答案:

答案 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作为构造函数(重构数据数组)。