2016-03-29 4 views
2

У меня есть рациональное число класса с construtor со значением по умолчанию 0/1 называется так:Java массив класса со значением по умолчанию

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; 
} 

Теперь, в подклассе, я хочу, чтобы создать массив Rationals. Все они имеют значение «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 
+0

Извините, но Java не делает этого, насколько мне известно. – callyalater

+0

Для примитивных типов вы можете использовать 'Arrays.fill'. – callyalater

+0

@callyalater 'Arrays.fill()' работает и для объектов, но применим здесь только в том случае, если 'Rational' является неизменным. –

ответ

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); 
+1

Да. Работает отлично. И это просто понять. –

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); 
} 

"Автоматический" инициализация по умолчанию что-то вроде C++ не является возможно здесь. Кроме того, ваши вложенные петли «нового стиля» for не работают, поскольку параметр rat = new Rational() переназначает временный rat, а не значение в массиве.

Как вы можете видеть, это заполняет матрицу одинаковым по умолчанию Rational. Это очевидная оптимизация производительности и памяти с неизменяемым Rational и позволяет избежать повторных вызовов конструктора. Если у вас есть mutable Rational (который я бы отговорил), это почти наверняка катастрофически неправильно: изменение одного значения изменит их все. В этом случае вы, вероятно, сделаете все возможное с вложенными петлями for «старого стиля». (Я думаю, что внешний «новый стиль» for петли с внутренним «старым стилем» for петли не будет так легко читать, но, конечно, это возможно.)

+0

@SashaSalauyou Я думаю, что вы прокомментировали, прежде чем я отредактировал свой ответ, чтобы включить эту информацию :-) –

+0

У меня есть изменяемый Rational. Я изменяю значения рациональных (в некоторых случаях целую строку). Так что было бы лучше «создавать новую матрицу» каждый раз, когда я меняю строку? Или я должен сохранить свой изменчивый стиль? –

+0

@ J.F.Я бы подумал, что 'Rational' должен быть неизменным, и установка его может быть выполнена следующим образом:' mat [5] [2] = mat [5] [2] .multiply (otherRational); 'и т. Д.? –

Смежные вопросы