# 2D Array in 1D konvertieren??



## Paddy1212 (3. Nov 2010)

Hey Leute =)

ich bin noch absoluter Anfänger und wollte fragen wie ich 2d arrays in 1d arrays umwandeln kann...
vllt hätte auch jmd noch ein kleines Beispiel damit ich es mir genau anschauen und vorallem verstehe.
wäre echt super, danke schonmal

Lg Paddy


----------



## Michael... (3. Nov 2010)

Was meinst Du mit umwandeln? Die Inhalte aus dem "2D" Array einfach in ein Array hintereinander einfügen?


----------



## XHelp (3. Nov 2010)

Kommt ja ganz drauf an was du damit erreichen willst:

```
X00 X01 X02
X10 X11 X12
kann zu:
X00
X10
X01
X11
X02
X12
werden, oder zu:
X00
X01
X02
X10
X11
X12
```


----------



## Paddy1212 (3. Nov 2010)

ich soll ein programm schreiben, dass 2 dimensionales arrays in ein 1 dimensionale umwandelt, jedoch finde ich einfach den ansatz nicht.... sehe wohl vor lauter Bäumen den Wald nicht 

```
public static int[] convertArrayTo1D(int[][] input)
```

das wäre der teil nachdem wir dann etwas einfügen müssen


----------



## Michael... (3. Nov 2010)

Ist denn eine Regel vorgegeben wie? XHelp hat ja bereits zwei mögliche Varianten aufgezeigt.


----------



## Paddy1212 (3. Nov 2010)

ich glaube ich verstehe einfach die frage wohl nicht, deswegen bin ich voll am falschen dampfer ... im kommentar steht noch :

```
/********************\
	 * Expected output: *
	 ********************
##### From 2D to 1D #####
[[1, 2, 3, 4], null, [6, 7, 8, 9, 10]]
----------
[1, 2, 3, 4, 6, 7, 8, 9, 10]
```

danke für eure antworten =) is echt super nett


----------



## Volvagia (3. Nov 2010)

...?


```
public class Classname
{
	public static void main(String[] args) 
	{
		int[][] array2D = new int[5][10];
		array2D[0][0] = 5;
		array2D[3][0] = 3;
		array2D[0][1] = 1;
		array2D[2][4] = 2;
		
		int[] array1D = new int[array2D.length * array2D[0].length];
		for(int i = 0, k = 0; i < array2D.length; i++)
			for(int j = 0; j < array2D[0].length; j++, k++)
				array1D[k] = array2D[i][j];
	}
}
```


----------



## XHelp (3. Nov 2010)

Also doch eine Hausaufgabe 

```
int count=0;
for (int i=0;i<input.length;i++) {
  if (input[i]!=null) {
    for (int j=0;input[i].length;j++) {
      count++;
    }
  }
}
int[] oneDarray = new int[count];
//und hier wieder ähnlich wie oben durchlaufen, nur das jetzt die wert aus input dem oneDarray zuweist.
```
... ohne es getestet zu haben


----------



## Paddy1212 (3. Nov 2010)

ich danke euch allen... etz kann ich mich in die anderen aufgaben viel besser rein und kann jetzt mal versuchen das ganze richtig zu verstehen =) werde mich etz mal die nacht dran setzen...


----------



## Paddy1212 (3. Nov 2010)

und ja es ist eine hausaufgabe.... aber nur der kleine Anfang  leider wird es noch viel schwerer :/ doch ich war da etz paar stunden dran... aber ich hab einfach keinen Anfang gefunden, weil ich denke ich die Frage einfach nicht wirklich kapiert habe


----------



## Xsicht111 (3. Nov 2010)

könnte man das ganze nicht mit na while-schleife machen? nur wüsst ich jez auf die schnelle nicht wie


----------



## XHelp (3. Nov 2010)

Xsicht111 hat gesagt.:


> könnte man das ganze nicht mit na while-schleife machen? nur wüsst ich jez auf die schnelle nicht wie



Jede Loop-berechenbare Funktion ist auch While-berechenbar  Also gehen würde das schon, läuft aber auf:

```
int i=0;
while (i<input.length) {
  //machwas
  i++;
}
```
hinaus, was wiederum eine andere Form der for-Schleife wäre, also nicht ganz so sinnvoll.


----------



## Marco13 (3. Nov 2010)

Um Arrays zu kopieren sollte man wenn möglich System.arraycopy verwenden.


----------



## Kaierkopf (4. Nov 2010)

Hallo,

ich hab beim obigen Programm das Problem das ich nen 
java.lang.NullPointerException- Fehler bekomm.

Das es daran liegt das ein Wert des arreys null ist weiß ich bereits, aber wie kann das Programm zum laufen bringen, obwohl ein Wert null, sprich unbekannt ist ?

Lg


----------



## Michael... (4. Nov 2010)

Kaierkopf hat gesagt.:


> aber wie kann das Programm zum laufen bringen


Du musst ein Prüfung auf null einbauen.


----------



## ARadauer (4. Nov 2010)

> Jetz kann ich mich in die anderen aufgaben viel besser rein und kann jetzt mal versuchen das ganze richtig zu verstehen =)


ja sicher... das ist ein trugschluss. so simple beispiele lesen bring eigentlich gar nix, man muss schon selber versuchen das zu lösen.. fremde beispiele verstehen ist viel schwerer als sie selber zu lösen...


----------



## Volvagia (4. Nov 2010)

Michael... hat gesagt.:


> Du musst ein Prüfung auf null einbauen.



Glaub ich nicht. Wenn er nur die Referenzen kopiert, spielt es keine Rolle ob sie null ist oder nicht. Da wäre Source schon interessant.


----------



## ARadauer (4. Nov 2010)

welche Referenzen?

array2D_[j];
 wenn array2D[1] null ist, kracht es bei array2D[1][j]

bzw schon bei length...



		Java:In die Zwischenablage kopieren


 int[] array1D = new int[array2D.length * array2D[0].length];
        for(int i = 0, k = 0; i < array2D.length; i++)
            for(int j = 0; j < array2D[0].length; j++, k++)
                array1D[k] = array2D[i][j];

würd ich nicht so machen, du gehst davon aus das alle arrays in dem array gleich lang sind... wenn das nicht der fall ist?_


----------



## Kaierkopf (4. Nov 2010)

Wie würdest dus machen ?

Habs etz so versucht, klappt auch fast :


```
public static int[] convertArrayTo1D(int[][] input) {
		int [] x = new int [input.length*input[0].length];
		
		for ( int i=0, k =0; i < input.length; i++ )
			if (input[i]!= null){
			for (int j=0; j < input[i].length; j++, k++)
			
						x[k] = input [i][j];
			}
```

Er wirft mmir etz zwar kein Fehler mehr aus, aber das :[1, 2, 3, 4, 6, 7, 8, 9, 0, 0, 0, 0]

Des waren die Eingabewerte : [[1, 2, 3, 4], null, [6, 7, 8, 9, 10]]

Wie kommen die letzten 4 Nullen zustande?


----------



## ARadauer (4. Nov 2010)

Kaierkopf hat gesagt.:


> Wie würdest dus machen ?




```
import java.util.Arrays;


public class Test {
	
	public static void main(String[] args) {
	    int[][] values = {{1,2,3,4},null,{6,7,8,9,10}};
	    					//[[1, 2, 3, 4], null, [6, 7, 8, 9, 10]]
	   
	    
	    int[] result = convertArrayTo1D(values);
	    System.out.println(Arrays.toString(result));
	  //[1, 2, 3, 4, 6, 7, 8, 9, 10]
	}

	public static int[] convertArrayTo1D(int[][] input) {
		//zuerst zählen...
		int count = 0; 
		for(int i = 0; i < input.length; i++){
			if(input[i] == null)
				continue;
			count += input[i].length;
		}
		
		//ergebnis aufbauen
		int [] result = new int[count];
		
		//und umkopieren
		int current = 0;
		for(int i = 0; i < input.length; i++){
			if(input[i] == null)
				continue;
			for(int j = 0; j< input[i].length; j++){
				result[current] = input[i][j];
				current++;
			}
		}
		return result;
	}



}
```


----------



## Kaierkopf (4. Nov 2010)

Ok, vielen Dank soweit!

Sprich du zählst immer erst die Länge des Arrays, zählt der mit dieser Programmierung alle Dimensionen?

Danach übergibst du den gezählten Wert als neue Länge für einen 1 D- array und lässt die Schleife durchlaufen.

Angenommen ich wollte etz eine 3 D in 1 D array konvertieren, dann zähl ich des erst wieder, und erweitere meine Programmierung um eine weitere for- Schleife die einen weiteren Wert( nur um im Alphabet zubleiben, sagen wir k)! Muss ich vor diesem wieder einen Null-Filter einbauen oder reicht einer?

Ich will wirklich keine fertige Lösung oder so was, ich verstehs nur echt net und mir konnte in diesem Fall auch kein Buch weiterhelfen.


----------



## Michael... (4. Nov 2010)

Kaierkopf hat gesagt.:


> Angenommen ich wollte etz eine 3 D in 1 D array konvertieren, dann zähl ich des erst wieder, und erweitere meine Programmierung um eine weitere for- Schleife die einen weiteren Wert( nur um im Alphabet zubleiben, sagen wir k)! Muss ich vor diesem wieder einen Null-Filter einbauen oder reicht einer?


Ja, ein "3D" int Array kann auf der ersten und zweiten Ebene null "enthalten"

```
int[][][] array = new int[3][][];
array[0] = null;
array[1] = new int[][] {{1, 2, 3}, null};
array[2] = new int[][] {{1}, {1, 2} , {1, 2, 3}, new int[5]};
```

Wobei man sich überlegen könnte, ob man ab einen "3D" Array das nicht mittels Rekursion statt zusätzlicher for-Schleifen könnte.


----------



## Kaierkopf (4. Nov 2010)

Ich hab des etz versucht nach dem Vorbild der 2D in 1D transformation zu machen, allerdings wirft er mir immer nen Fehler aus. Wenn ich die Größe des 1D- Arrays mit Hilfe der Zählprogrammierung bestimm wie im 2D Fall, zählt der da alle Dimensionen oder nur die 1? Hab auch schon versucht die Zahlschleife zu erweitern, aber ohne erfolg!

Lg


----------



## Michael... (4. Nov 2010)

Auch die Zählschleife muss um eine weitere for-Schleife ergänzt werden.


----------



## ARadauer (5. Nov 2010)

> Hab auch schon versucht die Zahlschleife zu erweitern, aber ohne erfolg!


zeig mal...,



> Ich will wirklich keine fertige Lösung oder so was, ich verstehs nur echt net und mir konnte in diesem Fall auch kein Buch weiterhelfen.



überleg dir das mal mit bleistifft und papier... was verstehst du genau nicht?
in einer schachtel sind schachteln drinen, wo wieder schachteln drinnen sind, wo Eier drinnen sind. 3D

jetzt willst du eine schachtel bauen die so viele fächer hat das alle eier platz haben. und du fragst jetzt ob du fächer in den ganz inneren schachteln auch mitzählen musst.  ähmn? ja klar!


das mit der null überprüfung.. ich würd generell nie ein programm schreiben, wo in einem mehrdimensionalen array irgendow mal mitendrin ein arry null sein kann... aber wenn die aufgabenstellung so ist... musst natürlich auch überprüfen...


----------



## Kaierkopf (5. Nov 2010)

Hi,


```
int zaehl = 0;
				for (int i = 0; i<input.length; i++){
					if (input [i] == null) continue;
						for(int j= 0;j <input[i].length;j++)
			zaehl +=  (input[i].length + input[j].length);
					}
```

Hab se auch schon einmal mit ner weiteren for- Schleife erweitert aber ich bekomm immer nen Fehler!

Addier ich unten die Länge richtig?


----------



## Michael... (5. Nov 2010)

Kaierkopf hat gesagt.:


> Addier ich unten die Länge richtig?


Nein. Und mit einen Array wie von mir gepostet würde auch eine NPE fliegen.


----------



## ARadauer (5. Nov 2010)

input_.length + input[j].length) = kompletter blödsinn!

mal dir das mal mit papier und bleistift auf und schau was du da überhaupt addierst!





			aber ich bekomm immer nen Fehler
		
Zum Vergrößern anklicken....

warum postest du den fehler nicht? :autsch:_


----------



## Andi_CH (5. Nov 2010)

Wie ich soeben in einem anderen Thread beschrieben habe, sind Programmierkenntnisse eine zwingende Voraussetzung um eine Programmiersprache zu lernen.

1. WAS will/muss ich tun
2. WIE will ich das lösen
3. TUN (Erst jetzt kommt eine Programmiersprache zum Zuge) impementieren und testen.

Wir können (ich gebs zu auch wollen) erst im Schritt 3 helfen.

überleg dir mit Papier und Stift wie du das Problem lösen willst ......

mehr steht eben hier


----------

