具有默认值的类的java数组

时间:2016-03-29 17:40:44

标签: java arrays default-value

我有一个带有construtor的Rational数字类,默认值为0/1,如下所示:

public Rational (){ this(0, 1);}

public Rational (int numerator, int denominator){
    this.numerator = numerator;

    if (denominator== 0)
        throw new IllegalArgumentException("Denominator can't be zero.");

    this.denominator = denominator;
}

现在,在子类中,我想创建一个Rational数组。他们都设置为" null"。所以我在Rational类中有两个方法将所有值都设置为零。我有一个用于简单数组,另一个用于矩阵:

public Rational[] zero(Rational[] array){
    for (int i=0; i<array.length; i++)
        array[i] = new Rational();

    return array;
}

public Rational[][] zero (Rational[][] matrix){
    for (int i=0; i<matrix.length; i++)
        for(int j=0; j<matrix[i].length; j++)
            matrix[i][j] = new Rational();

    return matrix;
}

首先,使用改进的循环会更好吗?类似的东西:

public Racional[][] zero(Racional[][] matrix){
    for (Racional[] arr : matrix)
        for (Racional rat : arr)
            rat = new Rational();

    return matrix;
}

第二,有没有办法创建数组或矩阵,而不必像原始类型那样手动将所有位置归零。

例如:

int[] arr = new int [10];            //All zero
Rational[] arr = new Rational [10];  //All null
arr = arr.zero (arr);                //All "default" - 0/1

2 个答案:

答案 0 :(得分:1)

使用不可变的Rational类,

public static class Rational {
    public final int num, denom;
    public Rational() {num = denom =0;}
    public Rational(int num, int denom) {this.num=num; this.denom=denom;}
}

可以这样做:

public static void zero(Rational[][] mat) {
    Rational def = new Rational();
    for (Rational[] arr : mat) {
        Arrays.fill(arr, def);
    }
}
public static void main (String[] args) throws java.lang.Exception
{
    Rational[][] mat = new Rational[5][5];
    zero(mat);
}

&#34;自动&#34;这里不能进行像C ++这样的默认初始化。另外,你的嵌套&#34;新式&#34; for循环不起作用,因为设置rat = new Rational()只会重新分配临时的rat,而不是数组中的值。

正如您所看到的,这会使用相同默认Rational填充矩阵。这是一个明显的性能和内存使用优化,具有不可变Rational,并避免重复的构造函数调用。如果你有可变的Rational(我不鼓励),这几乎肯定是灾难性的错误:改变一个值将改变它们。在这种情况下,您可能最好使用嵌套的#34;旧式&#34; for循环。 (我认为一个具有内部&#34;旧式&#34; for循环的外部&#34;新式&#34; for循环不会那么容易阅读,但是当然可行。)

答案 1 :(得分:1)

如果您使用Rational的数组和矩阵,请考虑在Rational类中编写静态辅助方法:

static public Rational[] newArray(int size) {
    Rational[] arr = new Rational[size];
    for (int i = 0; i < size; i++)
        arr[i] = new Rational();
    return arr;
}

static public Rational[][] newMatrix(int h, int w) {
    Rational[][] m = new Rational[h][];
    for (int i = 0; i < h; i++) 
        m[i] = newArray(w);
    return m;
}

然后,要实例化一个填充了默认实例的数组或矩阵,只需调用:

Rational[] array = Rational.newArray(10);

Rational[][] matrix = Rational.newMatrix(10, 5);