# zweidimensionales Array einselen und ausgeben



## javaanfängerin (28. Feb 2009)

Hallo,

ich hänge an einer vermutlich ganz einfachen Aufgabe (keine Hausaufgabe!!), sondern eine Aufgabe aus dem Modul meines Online-Studiengangs. Ich  ganz simpel eine Matrix deklarieren und ausgeben, bekomme aber nur Nullen.
Wo liegt der Fehler??

[HIGHLIGHT="Java"]/**
   * MatrixAusgabeTest.java
    matrixgerechter Ausgabe am Bildschirm
   * @author Goerlitz / Fabio Bacigalupo
   * @version 1.0, 1/2002
   */
public class MatrixAusgabeTest{


    public static int[][] matrix = new int[3][4];


/**
 * einlesen: Liest Zahlen in die
 * Matrix ein
 */
public static void einlesen() {


           // Deklaration
           matrix = new int[3][4];

            //Initialisierung
		 	int[][] matrix = {
		 	{17, 16, 14, 15},
		 	{10, 10, 10, 10},
		 	{28, 29, 28, 29}
	        };


}
   /**
    * ausgeben: Gibt die Reihung matrixgerecht am Bildschirm aus
    **/
  public static void ausgeben() {
     for (int k = 0; k < matrix.length; ++k) {

       for (int l = 0; l < matrix.length; ++l) {
        System.out.print(matrix[k][l] + "\t");
      }
       System.out.println("");

     }
   }
 }


[/HIGHLIGHT]

[HIGHLIGHT="Java"]/**
 * MatrixAusgabeStart.java
 * Programm, das ein Objekt der Klasse MatrixAusgabe.java erzeugt
 * um die Methoden aufzurufen
 * @author Goerlitz / Fabio Bacigalupo
 * @version 1.0, 1/2002
 */
public class MatrixAusgabeStartTest {

   public static void main(String[] Args) {

     MatrixAusgabeTest matrix = new MatrixAusgabeTest();

     System.out.print("\nDas Programm erzeugt eine Matrix, ");

     System.out.println("deren Komponenten ganzzahlige Zahlen sind. ");

     matrix.einlesen();
     matrix.ausgeben();

   }
}[/HIGHLIGHT]


Vielen Dank im Voraus
Hier mal das Original-Programm aus dem Modul. Statt der Zufallszahlen wollte ich einfach mit festen Werten initialisieren.

[HIGHLIGHT="Java"]/**
   * MatrixAusgabe.java
   * Programm zum Fuellen einer zweidimesionalen Reihung mit
   * Zufallszahlen und matrixgerechter Ausgabe am Bildschirm
   * @author Goerlitz / Fabio Bacigalupo
   * @version 1.0, 1/2002
   */
public class MatrixAusgabe {

    protected static final int anzZeilen = 3;
    protected static final int anzSpalten = 4;
    private static int[][] matrix = new int[anzZeilen][anzSpalten];
    private static java.util.Random generator;

/**
 * einlesen: Liest Zufallszahlen zwischen 0 und 9 in die
 * Matrix ein
 */
public static void einlesen() {

     generator = new java.util.Random();
     for (int i = 0; i < anzZeilen; ++i) {
       for (int j = 0; j < anzSpalten; ++j) {
         matrix_[j] = generator.nextInt(6);
       }
     }
   }

   /**
    * ausgeben: Gibt die Reihung matrixgerecht am Bildschirm aus
    **/
  public static void ausgeben() {
     for (int k = 0; k < anzZeilen; ++k) {
       for (int l = 0; l < anzSpalten; ++l) {
        System.out.print(matrix[k][l] + "\t");
      }
       System.out.println("");
     }
   }
 }
[/HIGHLIGHT]

[HIGHLIGHT="Java"]/**
 * MatrixAusgabeStart.java
 * Programm, das ein Objekt der Klasse MatrixAusgabe.java erzeugt
 * um die Methoden aufzurufen
 * @author Goerlitz / Fabio Bacigalupo
 * @version 1.0, 1/2002
 */
public class MatrixAusgabeStart {

   public static void main(String[] Args) {

     MatrixAusgabe matrix = new MatrixAusgabe();

     System.out.print("\nDas Programm erzeugt eine Matrix vom Typ ");
     System.out.println(matrix.anzZeilen + "," + matrix.anzSpalten + " ");
     System.out.println("deren Komponenten ganzzahlige Zufallszahlen ");
     System.out.println("aus dem Intervall [0..9] sind.\n");

     matrix.einlesen();
     matrix.ausgeben();

   }
}[/HIGHLIGHT]_


----------



## ARadauer (28. Feb 2009)

mhn ja ist für einen anfänger vielleicht nicht ganz einfach zu verstehen... aber


```
// Deklaration
           matrix = new int[3][4];

            //Initialisierung
		 	int[][] matrix = {
		 	{17, 16, 14, 15},
		 	{10, 10, 10, 10},
		 	{28, 29, 28, 29}
	        };
```
matrix = new int[3][4]; das wäre jetzt die variable aus der klasse, 
int[][] matrix = {.. hiermit initialisierst du eine neue lokale variable

so müsste es funktionieren


```
// Deklaration
           matrix = new int[3][4];

            //Initialisierung
		 	matrix = {
		 	{17, 16, 14, 15},
		 	{10, 10, 10, 10},
		 	{28, 29, 28, 29}
	        };
```


----------



## javaanfängerin (28. Feb 2009)

Danke. Dein Erklärung leuchtet schon ein. Jetzt meckert der Compiler: _Illegal start of expressio_n. Auch mit einer for-Schleife zum Einlesen funktioniert es nicht.


----------



## hdi (28. Feb 2009)

du kannst nicht einfach

matrix = ...

schreiben. Du musst immer angeben worum es sich handelt:

[HIGHLIGHT="Java"]// Deklaration:
int[][] matrix = new int[3][4][/HIGHLIGHT]

Man kann Arrays aber glaub ich nur direkt bei der Deklaration initialisieren,
danach muss man sie einzeln befüllen.

Entweder

[HIGHLIGHT="Java"]int[][] matrix = new int[][]{
		 	{17, 16, 14, 15},
		 	{10, 10, 10, 10},
		 	{28, 29, 28, 29}
	                };[/HIGHLIGHT]

oder

[HIGHLIGHT="Java"]int[][] matrix = new int[3][4];
// jetzt einzeln befüllen[/HIGHLIGHT]

Der von Ardauer gepostete Code funktionert, soweit ich weiss, nicht.


----------



## javaanfängerin (28. Feb 2009)

Danke hdi,

die Ausgabe besteht wieder nur aus Nullen.

Grüße!


----------



## hdi (28. Feb 2009)

Ja sie besteht aus Nullen wenn du es nicht befüllt hast.

Nach

[HIGHLIGHT="Java"]int[][] matrix = new int[3][4][/HIGHLIGHT]

musst du die einzelnen stelle befüllen:

[HIGHLIGHT="Java"]matrix[0][0] = 17;
matrix[0][1] = 16;
// usw.[/HIGHLIGHT]


----------



## Schandro (28. Feb 2009)

matrix ist ne Membervariable, gelle? d.h. das

int[][] matrix = new int[3][4]:

Darf nicht innerhalb einer Methode gemacht werden, weil sonst ne neue Variable erstellt wird, die auch matrix heist. In der Methode muss wenn überhaupt stehen

matrix = new int[3][4];


----------



## hdi (28. Feb 2009)

Ah ja klar, wenn das ne Member-Variable ist darfst du natürlich nicht
eine neue Variable mit dem gleichen Namen in der Methode erstellen.

Stichwort "Überschatten"


----------



## downtimes (28. Feb 2009)

```
for (int k = 0; k < matrix.length; ++k) {
     for (int l = 0; l < matrix.length; ++l) {
        System.out.print(matrix[k][l] + "\t");
}
```

ganz schlecht.. du solltest nicht zweimal matrix length verwenden sondern wenn dann in der inneren schlaufe matrix[k].length sonst kanns zu Exceptions kommen.

also machs so


```
for (int k = 0; k < matrix.length; ++k) {
     for (int l = 0; l < matrix[k].length; ++l) {
        System.out.print(matrix[k][l] + "\t");
}
```


----------



## javaanfängerin (28. Feb 2009)

Ok danke..
Leider habe ich mein Problem noch nicht gelöst. Es ist mein erster Kontakt mit zweidimensionalen Arrays. Am WE werde ich noch experimentieren, es kann ja eigentlich so ganz schwierig nicht sein..

Danke für die Hilfe!!!


----------



## Quaxli (28. Feb 2009)

Ich würde die Schleife so ausgeben

[highlight=Java]
        for (int k = 0; k < matrix.length; k++) {

            for (int l = 0; l < matrix[k].length; l++) {

                System.out.print(matrix[k][l] + "\t");

            }

            System.out.println("");
        }
        }[/highlight]

<edit>
 Hab' gerade gesehen, daß downtimes das ja so erklärt hat... 
</edit>


----------



## 0x7F800000 (28. Feb 2009)

und dieses *println("")* hast du da aus welchem grund hingeschrieben?
*println()* gibt (wahrscheinlich) einfach sofort einen Zeilenumbruch aus.
*print('\n')* gibt auch direkt einen Zeilenumbruch aus.
*println("")* dagegen nimmt die leere zeile und fängt erstmal damit an, die in den Ausgabestrom zu schreiben... Voll der Performancekill, die arme nanosekunde^^


----------



## hdi (28. Feb 2009)

@ Thread-Erstellerin

Ein 2d-Array ist ein Array von Arrays. Wenn du weisst, was ein 1d-Array ist,
solltest du keine Probleme haben.

Mit der ersten Dimension greifst du auf eines der Unter-Arrays zu, das ist noch
kein Element.
Erst in Kombination mit der zweiten Dimension kriegst du ein Element.

[HIGHLIGHT="Java"]int zahl = array[x][y];[/HIGHLIGHT]

macht also einfach nur folgendes:

[HIGHLIGHT="Java"]int zahl;
int[] unterArray = array[x];
zahl = unterArray[y];[/HIGHLIGHT]

Deswegen kannst du auch bei Schleifen nicht immer nur array.length verwenden,
weil das nur gut geht falls die enthaltene Matrix quadratisch ist, also falls die Anzahl
der einzelnen Elemente in jedem Unter-Array gleich der Anzahl der Unterarrays ist.

array.length = Anzahl von Arrays im Array
array[x].length = Anzahl von Elementen im Unter-Array x


----------



## javaanfängerin (28. Feb 2009)

Danke,

die Schleife habe ich bereits geändert. Es werden trotzdem nur Nullen ausgegeben. Die println("")-Methode sorgt für den Zeilenumbruch und somit für eine matrixgerechte Ausgabe. Es ist wie gesagt eine Aufgabe aus einem Lehrmodul. Es geht sicherlich alles geschickter und kürzer, aber ich bin noch ganz am Anfang. 

Sorry, wenn ich mich hier so dusselig anstelle.. 

Melde mich, wenn ich es hinbekommen habe. DANKE!!!


----------



## hdi (28. Feb 2009)

Wenn nur Nullen rauskommen befüllst du das falsche Array, bzw. lässt dir das
falsche ausdrucken.
Irgendwo hast du 2 Arrays am Start... reduzier das mal auf eins.
konkret heisst das im Code darf nur ein mal 

[HIGHLIGHT="Java"] = new[...][...][/HIGHLIGHT]

*oder*

[HIGHLIGHT="Java"] = {{...,...,...},{...},...}
[/HIGHLIGHT]
vorkommen.


----------



## 0x7F800000 (28. Feb 2009)

jetzt fängt das Raten an: OP hat den quellcode schon längst dreimal abgeändert, und berichtet stets von irgendwelchen Problemen, aber nach so vielen Änderungen kann man nur noch sehr grob raten, wo der Fehler liegt. Warten wir einfach mal, bis der neue code gepostet wird.


----------

