2016-03-29 7 views
2

Ich habe eine rationale Zahl Klasse mit einem construtor mit einem Standardwert von 0/1 wie folgt aufgerufen:Java-Array einer Klasse mit Standardwert

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

nun in einer Unterklasse, ich will eine erstellen Array von Rationen. Sie kommen alle auf "null". Also habe ich zwei Methoden innerhalb der Rational-Klasse, die alle Werte auf Null setzen. Ich habe eins für ein einfaches Array und ein anderes für eine Matrix:

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

Erstens, wäre es besser, verbesserte Schleifen zu verwenden? Etwas wie:

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

    return matrix; 
} 

Zweitens ist es eine Möglichkeit, ein Array oder eine Matrix, ohne manuell zu erstellen, um alle Positionen Null, wie wir mit primitiven Typen tun können.

zB:

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

Tut mir leid, aber Java tut das nicht, soweit ich weiß. – callyalater

+0

Für primitive Typen können Sie 'Arrays.fill' verwenden. – callyalater

+0

@callyalater 'Arrays.fill()' funktioniert auch für Objekte, aber es ist nur anwendbar, wenn 'Rational' unveränderlich ist. –

Antwort

1

Wenn Sie mit Arrays und Matrizen von Rational stark arbeiten betrachten statische Hilfsmethoden in Rational Klasse zu schreiben:

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

Dann ein Array oder eine Matrix mit Standardinstanzen gefüllt zu instanziiert, rufen Sie einfach:

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

oder

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

Ja. Funktioniert gut. Und es ist einfach zu verstehen. –

1

eine unveränderliche Rational-Klasse verwenden,

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

Es kann wie folgt geschehen:

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

"Automatisch" Standardinitialisierung so etwas wie C++ ist nicht möglich hier. Außerdem funktionieren Ihre verschachtelten "neuen" for Loops nicht, da die Einstellung rat = new Rational() nur das temporäre rat neu zuweist, nicht den Wert im Array.

Wie Sie sehen, füllt dies die Matrix mit der gleichen Standard Rational. Dies ist eine offensichtliche Performance- und Speichernutzungsoptimierung mit unveränderlichem Rational und vermeidet wiederholte Konstruktoraufrufe. Wenn Sie veränderbar sind Rational (was ich entmutigen würde), ist dies fast sicher katastrophal falsch: Änderung eines Wertes wird sie alle ändern. In diesem Fall werden Sie wahrscheinlich am besten mit den verschachtelten "alten" for Loops arbeiten. (Ich glaube, eine äußereer „neuer Stil“ for Schleife mit einem inneren „im alten Stil“ for Schleife nicht so einfach sein würde, zu lesen, aber es ist sicherlich machbar.)

+0

@SashaSalauyou Ich glaube, du hast es kommentiert, bevor ich meine Antwort editiert habe, um diese Information einzubinden :-) –

+0

Ich habe ein veränderliches Rational. Ich ändere die Werte der Rationals (in einigen Fällen eine ganze Reihe). Wäre es also besser, jedes Mal, wenn ich eine Zeile ändere, eine neue Matrix zu erstellen? Oder sollte ich meinen veränderlichen Stil beibehalten? –

+0

@ J.F.Ich würde denken, dass "Rational" unveränderlich sein sollte, und das Einstellen kann so gemacht werden: 'mat [5] [2] = mat [5] [2] .multiply (otherRational);' usw.? –

Verwandte Themen