# Arrays Kartentrick funktioniert nicht richtig



## maxl199 (30. Dez 2012)

Hallo, 
ich habe in der Schule eine Aufgabe bekommen, einen Kartentrick zu simuliere. Die Aufgabe findet ihr im Anhang... 
Hier mein Java Code:

```
public class Kartentrick
{
	public static void main(String[] args) {
		 do {
			 
			 int[][] karten = null;
			 karten = fuellen(karten, 0);
			 ausgeben(karten);
			 int spalte = TestScannerErweitert.readInt("Spalte der Karte: ");
			 
			 karten = fuellen(karten,spalte);
			 ausgeben(karten);
			 spalte = TestScannerErweitert.readInt("Spalte der Karte: ");
			 
			 karten = fuellen(karten,spalte);
			 ausgeben(karten);
			 spalte = TestScannerErweitert.readInt("Spalte der Karte: ");
		 } while (Character.toLowerCase(TestScannerErweitert.readChar("Nochmals? (j/n)")) == 'j');
	}
	/**
	 * Wenn der Spieler 0 als Spalte eingebit, so werden die Karten der Reihe nach ausgelegt.
	 * Wenn der Spieler 1 als Spalte eigibt, so werden zuerst die Karten der Spalte 2 ausgelegt, dann die der Spalte 1
	 * und zum Schluss die der Spalte 3.Wenn der Spieler 2 als Spalte eigibt, so werden zuerst die Karten der Spalte 1
	 * ausgelegt, dann die der Spalte 2 und zum Schluss die der Spalte 3. Wenn der Spieler 3 als Spalte eigibt, 
	 * so werden zuerst die Karten der Spalte 1 ausgelegt, dann die der Spalte 3 und zum Schluss die der Spalte 2. 
	 * @param karten
	 * @param spalte
	 * @return Array der ausgelegten Karten
	 */
	public static int[][] fuellen(int[][] karten, int spalte) {
		int[][] ret = null;
		int zahl = 1;
		// Spalte wird 0 übergeben
		if (spalte == 0) {
			ret = new int [7][3];
			for (int i = 0; i < 3; i++){
				for (int j = 0; j < 7; j++){
					ret[j][i] = zahl;
					zahl++;
				}
			}
		}
		// Spalte wird 2 Ÿbergeben
		if (spalte == 2) {
			ret = new int[7][3];
			int[] tmp = new int [7];
			// komme hier nicht weiter
			int j = 0;
			int k = 0;
			for (int i = 0; i < 7; i++) {
				if (i == 3 || i == 6 || i == 9)
					j++;
				ret[j][i] = tmp[i];
				j++;
			}
//			int iergebnis = 0;
//			int jergebnis = 0;
//			for (int ioriginal = 0; ioriginal < 3; ioriginal++){
//				for (int joriginal = 0; joriginal < 7; joriginal++){
//					if (iergebnis > 2) {
//						iergebnis = 0;
//					}
//					ret[iergebnis][jergebnis] = karten[ioriginal][joriginal];
//					iergebnis = iergebnis +1;
//					jergebnis = jergebnis +1;
//				}
//			}
		}
		return ret;
	}
	/**
	 * Es wird das Array zeilenweise ausgegeben. 
	 * @param karten
	 */	
	public static void ausgeben(int [][] karten) {

		for (int i = 0; i < karten.length; i++){
			for (int j = 0; j < karten[i].length; j++){
				System.out.print(karten[i][j]+" ");
			}
			System.out.println();
		}
	}

}
```
soweit läuft auch alles richtig bis auf

```
// Spalte wird 2 Ÿbergeben
		if (spalte == 2) {
			ret = new int[7][3];
			int[] tmp = new int [7];
			// komme hier nicht weiter
			int j = 0;
			int k = 0;
			for (int i = 0; i < 7; i++) {
				if (i == 3 || i == 6 || i == 9)
					j++;
				ret[j][i] = tmp[i];
				j++;
			}
//			int iergebnis = 0;
//			int jergebnis = 0;
//			for (int ioriginal = 0; ioriginal < 3; ioriginal++){
//				for (int joriginal = 0; joriginal < 7; joriginal++){
//					if (iergebnis > 2) {
//						iergebnis = 0;
//					}
//					ret[iergebnis][jergebnis] = karten[ioriginal][joriginal];
//					iergebnis = iergebnis +1;
//					jergebnis = jergebnis +1;
//				}
//			}
```
 hier bekomme ich einen Fehler ;(

Danke schonmal im Voraus


----------



## Marcinek (30. Dez 2012)

Sorry, du hast ausversehen den Beitrag gepostet, ohne die Fehlermeldung.:bahnhof:


----------



## maxl199 (30. Dez 2012)

Sory hab ich vergessen 

hier die Ausgabe mit Fehlermeldung:

1 8 15 
2 9 16 
3 10 17 
4 11 18 
5 12 19 
6 13 20 
7 14 21 
Spalte der Karte: 2
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 3
	at Kartentrick.fuellen(Kartentrick.java:53)
	at Kartentrick.main(Kartentrick.java:11)


----------



## Marcinek (30. Dez 2012)

Du hast in deinem array zeilen und spalten vertauscht.

DAs i wird zu groß.

Außerdem hast du zwei Arrays

ret = new int[7][3];
            int[] tmp = new int [7];

Alle Haben den inhalt  "0".

Und dann werden daraus werte in ret gespeichert, die alle nur 0 haben.


----------



## maxl199 (30. Dez 2012)

ja das verstehe ich aber wie du in der Aufgabenstellung siehst, soll bei der Eingabe von zwei zuerst die 1. Spalte waagrecht, dann die 2. waagrecht, dann die 3. waagrecht ausgegeben werden. Und genau das bekomme ich nicht hin


----------



## Timothy Truckle (30. Dez 2012)

maxl199 hat gesagt.:


> hier bekomme ich einen Fehler ;(


Was ich mit sicherheit dazu sagen kann ist: Da hast Du wohl was falsch gemacht.

Bitte poste die Fehlermeldung. Dann bekommst Du auch bessere Antworten.

bye
TT


----------



## maxl199 (30. Dez 2012)

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 3
at Kartentrick.fuellen(Kartentrick.java:53)
at Kartentrick.main(Kartentrick.java:11)


Die Fehlermeldung verstehe ich schon aber mein Problem ist folgendes:
ich habe folgendes Array:
1 8 15
2 9 16
3 10 17
4 11 18
5 12 19
6 13 20
7 14 21

und nun soll ein neues Array gemacht werden, das zuerst die 1. Spalte waagrecht, dann die 2. waagrecht, dann die 3. waagrecht beinhaltet. Und genau das bekomme ich nicht hin
Es sollte danach so ausschauen:
1 2 3
4 5 6
7 8 9
10 11 12
13 14 15
16 17 18
19 20 21

genau so wie es im Anhang beschrieben und abgebildet ist...


----------



## Marcinek (30. Dez 2012)

```
public class Array {

	public static void main(String[] args) {
		int arrayOriginal [][] = new int[][]
		{
				{1,8,15}, {2,9,16}, {3,10,17}, {4,11,18}, {5,12,19 }, {6,13,20}, {7,14,21}
		};
		
		int newArray[][] = new int [7][3];
		
		for(int i = 0; i < 21; i++) {
			newArray[(i / 3) % 7][(i%3)] = arrayOriginal[(i % 7)][(i / 7) % 3];
		}
		
        for (int[] arr : newArray) {
            System.out.println(Arrays.toString(arr));
        }
	}
}
```


----------



## maxl199 (31. Dez 2012)

Danke Marcinek  soweit funktioniert mein Programm jetzt, aber wenn ich z.B. 1 übergib dann muss ja ein Array erstellt werden, das zuerst den 2. Stapel, dann den 1. dann den 3. Stapel waagrecht enthält.... wie kann ich das dann implementieren???
Oder wenn ich 3 übergebe dann ist das selbe Problem nur muss halt als erstes der 1. Stapel dann der 3. dann der 2. Stapel ins Array geschrieben werden...
Wäre nett wenn du mir hierbei auch helfen könntest  Ich bekomme es einfach nicht hin


----------



## Marcinek (31. Dez 2012)

Hallo,

du kannst mit einem einfach offset machen und das o.g. entsprechend anpassen.

Ich denke mein Beispiel zeigt ganz gut, wie man das macht.

Du musst etwas machen, dass das 8 Element  auf Position 0,0 macht.

Wir machen hier ja keine Hausaufgaben ;D - Mit Copy-Past kommst du nicht weit ^^ Du musst schon verstehen, was da passiert.

Gruß,

Martin


----------



## maxl199 (31. Dez 2012)

Sorry aber ich verstehe nicht was ein Offset ist


----------



## Marcinek (31. Dez 2012)

Daran kann ich nun wirklich nix ändern =( :rtfm:


----------

