java 具有默认值的 class 数组
java array of a class with default value
我有一个有理数 class,其构造函数的默认值为 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;
}
现在,在子class 中,我想创建一个有理数数组。他们都设置为 "null"。所以我在 Rational class 中有两个方法将所有值设置为零。我有一个用于简单数组,另一个用于矩阵:
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
使用不可变 Rational
class,
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);
}
"Automatic" 这里不可能像 C++ 这样的默认初始化。此外,嵌套的 "new-style" for
循环不起作用,因为设置 rat = new Rational()
只会重新分配临时值 rat
,而不是数组中的值。
如您所见,这会用 相同 默认值 Rational
填充矩阵。这是不可变 Rational
的明显性能和内存使用优化,并且避免了重复的构造函数调用。如果你有可变的 Rational
(我不鼓励这样做),这几乎可以肯定是灾难性的错误:改变一个值将改变所有值。在这种情况下,您可能最好使用嵌套的 "old-style" for
循环。 (我认为带有内部 "old-style" for
循环的外部 "new-style" for
循环不会那么容易阅读,但肯定是可行的。)
如果您大量使用 Rational
的数组和矩阵,请考虑在 Rational
class:
中编写静态辅助方法
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);
我有一个有理数 class,其构造函数的默认值为 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;
}
现在,在子class 中,我想创建一个有理数数组。他们都设置为 "null"。所以我在 Rational class 中有两个方法将所有值设置为零。我有一个用于简单数组,另一个用于矩阵:
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
使用不可变 Rational
class,
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);
}
"Automatic" 这里不可能像 C++ 这样的默认初始化。此外,嵌套的 "new-style" for
循环不起作用,因为设置 rat = new Rational()
只会重新分配临时值 rat
,而不是数组中的值。
如您所见,这会用 相同 默认值 Rational
填充矩阵。这是不可变 Rational
的明显性能和内存使用优化,并且避免了重复的构造函数调用。如果你有可变的 Rational
(我不鼓励这样做),这几乎可以肯定是灾难性的错误:改变一个值将改变所有值。在这种情况下,您可能最好使用嵌套的 "old-style" for
循环。 (我认为带有内部 "old-style" for
循环的外部 "new-style" for
循环不会那么容易阅读,但肯定是可行的。)
如果您大量使用 Rational
的数组和矩阵,请考虑在 Rational
class:
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);