# Array als Matrix



## Eyian (18. Nov 2011)

Hallo Forum,
brauche Hilfe von euch und zwar geht es um diesen Quelltext:


```
public static void main (String[]args){
 
 int i,j;
String[][] Rhein= new String [645][965];

  for (i=0;i<Rhein.length;++i){
  for(j=0;j<Rhein.length;++j){
  Rhein[i][j]="~";
  System.out.print(" "+Rhein[i][j]+ "\t");
  System.out.println();
 
}}}
```

wir wollen das "~" in einer 2 dimensionalen Matrix dargestellt wird. Ungefähr so:
~~~~~~
~~~~~~
~~~~~~
~~~~~~
~~~~~~

Bei uns steht das untereinander und nicht nebeneinander
~
~
~
~
~ usw. 


Gruß


----------



## faetzminator (18. Nov 2011)

Das [c]System.out.println();[/c] muss in der äusseren Schleife stehen. Formatier doch den Code gleich hübsch:

```
String[][] rhein = new String [645][965];

for (int i = 0;i < rhein.length; ++i) {
    for(int j = 0;j < rhein[i].length; ++j) {
        rhein[i][j] = "~";
        System.out.print(" " + rhein[i][j] + "\t");
    }
    System.out.println();
}
```


----------



## Gast2 (18. Nov 2011)

Ihr schreibt ja auch nach jedem print direkt nen println(), da isses doch klar dass er nach jedem Zeichen nen Zeilenumbruch einfügt oder nicht? 

Teilt den Code am besten auf:
- Zuerst Array erstellen
- Array befüllen (2 for schleifen)
- Array ausgeben (2 for schleifen)
Und rückt den Code dabei vernünftig ein. So ist der Code unleserlich.


----------



## Eyian (18. Nov 2011)

Danke faetzminator!!! Suchen seid ner Stunde nach dem Fehler ... einfahc nicht gesehen 


:applaus:


----------



## faetzminator (18. Nov 2011)

Hoffentlich hast du noch gesehen, dass ich in der zweiten Schleife auf [c]rhein_.length[/c] und nicht [c]rhein.length[/c] überprüfe  Sobald das Array nämlich in allen Dimensionen nicht mehr gleich gross ist, hast du dann deinen Spass._


----------



## Eyian (18. Nov 2011)

Aber wenn ich Rhein_.length statt Rhein.length schreibe dann geht doch j nur bis 645 in diesem beispiel ??_


----------



## faetzminator (18. Nov 2011)

Eben nicht, umgekehrt. *r*hein.length gibt dir 645 zurück. Und rhein[0..644].length gibt dir 965 zurück


----------



## wtfwthguestname (18. Nov 2011)

Eyian hat gesagt.:


> Aber wenn ich Rhein_.length statt Rhein.length schreibe dann geht doch j nur bis 645 in diesem beispiel ??_


_

Nein.
rhein.length == 645
rhein.length == 965_


----------



## guestIrgedwie (18. Nov 2011)

Erste Dimension: Die Zahl, die bei der Initialisierung zuerst angegeben wird
Zweite Dimension: Dann die andere

Initialisierung: Variablendeklaration+Zuweisung

Array length ist nicht änderbar

Eine Frage: Warum gerade diese Arraygrenzen (so hoch)? und warum immer gleiche Zeichen als Ausgabe?


----------



## Eyian (20. Nov 2011)

Vielen dank ^^


----------



## Eyian (20. Nov 2011)

ah wir sollten nen fluss darstellen und deswegen das zeichen und die größe


----------



## Lela (20. Nov 2011)

wie kann man dann an bestimmte stellen andere zeichen einsetzen??

zum beispiel bei den koordinaten [5][6] anstatt "~" ein "*"


----------



## faetzminator (20. Nov 2011)

Nach den Schleifen einfach [c]rhein[5][6] = '*'[/c] schreiben, oder falls es gleich in der Schleife sein soll, mit einem if. Das würde ich aber nicht empfehlen. Lieber zuerst die Grundstruktur ('~', ich nehm mal an das soll Wasser sein) und dann nach und nach Dinge (wle Land, Boote, ...) "reinzeichnen".


----------



## Lela (20. Nov 2011)

Ja genau. 
So hatte ich es eigentlich auch versucht, hat aber nicht funktioniert.
Kannst du das vllt. mal wie in deinem beispiel oben etwas genauer zeigen, damit ich weiß wo der Fehler liegt? 
Ich habe gerade erst mit dem programmieren angefangen und hab noch nicht so viel Ahnung.

Wär echt nett . Danke!


----------



## faetzminator (20. Nov 2011)

Ich würd alles erst am Schluss ausgeben.
Und dann würde ich keine Strings, sondern chars verwenden. Zusätzlich könnte man noch eine Liste, also [c]List<List<Character>>[/c] statt [c]char[][][/c] verwenden.
Also irgendwie so:

```
char[][] rhein = new char[645][965];
// überall '~' einsetzen.
for (int i = 0; i < rhein.length; i++) {
    for (int j = 0; j < rhein[i].length; j++) {
        rhein[i][j] = '~';
    }
}
// irgendwo andere Werte setzen
rhein[5][6] = '*';
// ausgeben
for (char[] reihe : rhein) {
    for (char c : reihe) {
        System.out.print(c);
        System.out.print('\t');
    }
    System.out.println();
}
```


----------



## Eyian (21. Nov 2011)

Also meine aufgabe war den fluss zu zeichnen und dann sollte ich eingeben an welcher stelle ein boot gesunken ist mit * makieren. Mein Quellcode


```
package Rhein;

import javax.swing.JOptionPane;

public class Aufgabe2 {

	public static void main (String[]args){
		
 int laenge1,breite1,laenge2,breite2,laenge3,breite3;
 laenge1 = Integer.parseInt(JOptionPane.showInputDialog("Längenkoordinaten Wrack 1"));
 breite1 = Integer.parseInt(JOptionPane.showInputDialog("Breitenkoordinaten Wrack 1"));
 laenge2 = Integer.parseInt(JOptionPane.showInputDialog("Längenkoordinaten Wrack 2 "));
 breite2 = Integer.parseInt(JOptionPane.showInputDialog("Breitenkoordinaten Wrack 2"));
 laenge3 = Integer.parseInt(JOptionPane.showInputDialog("Längenkoordinaten Wrack 3"));
 breite3 = Integer.parseInt(JOptionPane.showInputDialog("Breitenkoordinaten Wrack 3"));

 
 int i,j;
String[][] Rhein= new String [5][10];

  for (i=0;i<Rhein.length;++i){
	  
	  for(j=0;j<Rhein[i].length;++j){
		  
		  Rhein[i][j]="~";
		  
		  if (i == laenge1)
			if  (j == breite1)
			  Rhein[i][j]="*";
		  
		  if (i == laenge2)
				if  (j == breite2)
				  Rhein[i][j]="*";
		  
		  if (i == laenge3)
				if  (j == breite3)
				  Rhein[i][j]="*";
		  
		  
		  System.out.print(" "+Rhein[i][j]+ " "); }
	  
  System.out.println();
  
 }}}
```


----------



## faetzminator (21. Nov 2011)

Wenn du es gleich ausgibst, warum füllst du dann überhaupt ein Array? Sieh dir meinen Code an. Schön schlank, schön getrennt. Füg einfach nach [c]// irgendwo andere Werte setzen[/c] beliebigen Code ein, welchen diese [c]*[/c] markieren lässt. Kann man auch wunderbar mit einer Schleife realisieren.
Also irgendwas wie

```
for (int i = 1; i <= 3; i++) {
    int laenge = Integer.parseInt(JOptionPane.showInputDialog("Längenkoordinaten Wrack " + i));
    int breite = Integer.parseInt(JOptionPane.showInputDialog("Breitenkoordinaten Wrack " + i));
    rhein[laenge][breite] = '*';
}
```


----------



## Eyian (21. Nov 2011)

faetzminator ja das ist top ich wollte das eigentlich das so oft eingeben bis ich stop sage und wusste nicht wie ich das hinkriegen sollte aber das hilft mir richtig weiter !!!


----------



## faetzminator (21. Nov 2011)

Du kannst auch vor dem parsen in einen int einen Check machen, ob der eingegebene String null oder leer oder was auch immer ist. Da könntest du eine do-while-Schleife verwenden und dies als Abbruchkriterium implementieren.


----------



## Eyian (21. Nov 2011)

genau so hatte ich das auch vor mit ner do while schleife


----------



## Eyian (22. Nov 2011)

hey faetzminator hast du dazu einen lösungsansatz oder ne seite wo man die jOptionPane methoden vernünftig erklärt sind... kennee bis jetzt nur default.... danke


----------



## faetzminator (22. Nov 2011)

Es gibt die Javadoc hier: Java Platform SE 6
Ansonsten ein Direktlink auf JOptionPane: [japi]JOptionPane[/japi]


----------

