# ArrayList mit char- Array befüllen



## HazlNut (21. Nov 2013)

Servus erst mal an alle!

hab jetzt mal mit der Suchfunktion anfangs gesucht aber nichts zu dem Thema gefunden. 
Habe folgendes Problem: 

Ich erstelle eine ArrayList die ich mit Chracter- Arrays befüllen möchte.


```
ArrayList<Character[]> klarText = new ArrayList<Character[]>();
```

Des weiteren habe ich ein Losungswort der länge n, unter das ich einen Text schreibe der anhand des Losungswortes kodiert werden soll. 
Der zu verschlüsselnde Text soll in char-arrays gespeichert werden, die die selbe länge haben wie das Losungswort. Nennt sich Doppelwürfel nach Leib oder so.

Meine Frage ist jetzt: Wie könnte ich jetzt die Arrays befüllen und dann in die ArraysList hinzufügen.
Vielleicht hab ich nur nen Knoten im Kopf und es ist eigentlich ganz einfach, aber aktuell keine Ahnung :-D

Bedanke mich schonmal für Hilfe und Antworten.

Lg HazlNut


----------



## diggaa1984 (21. Nov 2013)

da deine Arrays ja die Länge n haben ist es ja einfach:

```
//erstellen
Character[] a = new Character[n];

//fuellen
for (int = 0; i<a.lengthj; i++) {
    a[i] = ;//Wert muss eben ermittelt werden
}

//adden
klarText.add(a);
```


----------



## HazlNut (21. Nov 2013)

Ich habe jetzt eben folgendes hinbekommen: 


```
ArrayList<Character[]> klarText = new ArrayList<Character[]>();
		
		Character[] rest = new Character[restArrayLaenge];
		
		int textI = 0;
		
		for(int i = 0; i<anzahlArray; i++){
			klarText.add(new Character [sortiert.length]);
			for(int j = 0; j<sortiert.length; j++){
				klarText.get(i)[j]= text.charAt(textI);
				textI += 1;
			}
		}
		klarText.add(rest);
		for(int i = 0; i<restArrayLaenge; i++){
			klarText.get(anzahlArray+1)[i] = text.charAt(textI);
			textI += 1;
		}
```

Das Ding ist, die Anzahl der Arrays hängt ja von der länge des Losungswortes und der Länge des Textes ab: In meinem Beispiel ist jetz zb das Losungswort "SCHWARZWALD" und den Text den ich erst mal so drin habe hat 73 Zeichen. Sprich: Ich brauche 6 Arrays der länge "SCHWARZWALD" und noch ein zusätzliches mit der länge 7, da text.length%"SCHWARZWALD".length.

Würdet ihr das genauso lösen wie hier, oder gibts da was besseres?

Wobei ich auch gerade sehe, dass der Code oben noch net richtig ist


----------



## VfL_Freak (21. Nov 2013)

Moin,



HazlNut hat gesagt.:


> Würdet ihr das genauso lösen wie hier ?
> Wobei ich auch gerade sehe, dass der Code oben noch net richtig ist


Wenn nicht richtig ist, dann wohl erher nicht ..... :lol:

So, und nun erkläre dies


HazlNut hat gesagt.:


> Das Ding ist, die Anzahl der Arrays hängt ja von der länge des Losungswortes und der Länge des Textes ab: In meinem Beispiel ist jetz zb das Losungswort "SCHWARZWALD" und den Text den ich erst mal so drin habe hat 73 Zeichen. Sprich: Ich brauche 6 Arrays der länge "SCHWARZWALD" und noch ein zusätzliches mit der länge 7, da text.length%"SCHWARZWALD".length.


bitte noch mal verständlich!

Wieso brauchst Du bei "SCHWARZWALD" sechs Arrays mit dieser Länge ???:L

Gruß
Klaus


----------



## diggaa1984 (21. Nov 2013)

Da mir der Algorithmus nicht geläufig ist, ist es auch schlecht mit detaillierter Hilfe. Wie du Arrays erstellst und wie du sie der Liste hinzufügst und füllst weisst du ja nun


----------



## HazlNut (21. Nov 2013)

Sorry wenn ich mich bisschen unklar ausdrücke :lol:
Ich kopier einfach mal die Erklärung zu diesem Doppelwürfel:

"Geheimer Bestandteil des Verfahrens ist ein Losungswort (im Beispiel "Schwarzwald"). Man
sortiert die Buchstaben des Losungswortes nach dem Alphabet, nummeriert sie durch und schreibt
unter jeden Buchstaben des Losungswortes seine so ermittelte Nummer. Das ergibt die sogenannte
Zahlenlosung; es handelt sich um eine Permutation der Zahlen von 1 bis n, wobei n die Länge des
Losungswortes ist." Im Beispiel lautet die Zahlenlosung (8 3 5 9 1 7 11 10 2 6 4), in Ihrer Lösung
nummerieren Sie die Spalten von 0 bis n-1, nehmen also die Permutation (7 2 4 8 0 6 10 9 1 5 3)."

Danach schreibt man seinen text unter diese Zahlenlosung und nimmt zuerst alle Buchstaben die unter 1 (bzw 0) stehen, dann alle Buchstaben die unter 2 stehen, usw.
BSP:

7  2  4  8  0  6  10  9  1  5  3
H  a  l   l   o  w   i   e  g  e  h 
t  e  s  d   i   r

würde dann zum Geheimtext: "oigaehlsewrhtldei"

Das ganze soll sich "Doppelwürfel nach Leib" nennen soweit ich weiß.

Ich hatte jetz einfach mal einen Text mit 73 Zeichen. Schwarzwald hat 11 Buchstaben. Deswegen kann ich 6 Arrays mit der länge 11 erstellen und das letzte Array muss eben nur die länge 7 haben, da 7 Buchstaben übrig bleiben.

Ich hoffe ich kann es halbwegs erklären um was es geht. Wir hatten selbst sehr große Probleme diese Aufgabe zu verstehen  :lol:


----------



## diggaa1984 (21. Nov 2013)

Ok, soweit klar.
Wo genau hängst du jetzt fest


----------



## HazlNut (21. Nov 2013)

```
int restArrayLaenge = text.length()% sortiert.length;
		int anzahlArray = text.length()/sortiert.length;
		
		ArrayList<Character[]> klarText = new ArrayList<Character[]>();
		
		Character[] rest = new Character[restArrayLaenge];
		
		int textI = 0;
		
		for(int i = 0; i<anzahlArray; i++){
			klarText.add(new Character [sortiert.length]);
			for(int j = 0; j<sortiert.length; j++){
				klarText.get(i)[j]= text.charAt(textI);
				textI += 1;
			}
		}
		klarText.add(rest);
		for(int i = 0; i<restArrayLaenge; i++){
			klarText.get(anzahlArray)[i] = text.charAt(textI);
			textI += 1;
		}
```

Das hab ich jetzt soweit und passt auch. Müsste jetz die kodierung starten aber hab gerade noch kein Plan wie das gehen soll


----------



## diggaa1984 (21. Nov 2013)

Kodierung ist ja quasi:
Suche die stellt X im Permutationsarray wo [x] = 0
Dann schreibe text.getCharAt(x) an das klarText.get(i)[j]

korrekt?
Was genau ist sortiert? Du sortierst ja das Wort Schwarzwald nicht, du ermittelst lediglich die Indizes der aufsteigenden Buchstabenreihenfolge.

Für mich ist das hier noch verkehrt, oder habe ich ein Brett vorm Kopf

```
//was soll textI sein
for(int j = 0; j<sortiert.length; j++) { 
    klarText.get(i)[j]= text.charAt(textI);
    textI += 1;
}
```
Du schreibst hier quasi unkodiert den Text ins Array oder?


----------



## HazlNut (21. Nov 2013)

textI zeigt praktisch immer auf die i'te Stelle im Text der kodiert werden soll. Damit man halt alle Buchstaben aus dem Text in die Arrays bekommt.
Oder hab ich das vielleicht etwas zu kompliziert gemacht?

Und beim Kodierverfahren hatte ich die gleiche idee wie du, aber aktuell echt nen dicken Knoten im Kopf und komm nicht weiter


----------



## HazlNut (21. Nov 2013)

Vielleicht irgendwas in diese Richtung?


```
StringBuilder geheimText = new StringBuilder();
		int indexText = 0;
		
		for(int i = 0; i<anzahlArray; i++){
			for(int j = 0; j<sortiert.length; j++){
				while(klarText.get(i)[j] != i){
					indexText += 1;
				}
				geheimText.append(klarText.get(i)[j]);
			}
		}
```


----------



## diggaa1984 (21. Nov 2013)

Die Optimierung sei dir Überlassen 


```
public static void main(String[] args) {                
	int[] permutation = {7,2,4,8,0,6,10,9,1,5,3};
	String klarText = "Hallo wie geht es dir?";
	
	ArrayList<Character[]> splittedText = new ArrayList<Character[]>();
	
	klarText = klarText.replaceAll("\\s+", "");
	int lengthKlarText = klarText.length();
	int lengthPermutation = permutation.length;
	int numberOfArrays =  (lengthKlarText / lengthPermutation) + 1;
	int finalArrayLength = lengthKlarText % lengthPermutation;
			
	int index = 0;
	int[] indicesOfSortedPermutIndices = new int[lengthPermutation];
	while (index < lengthPermutation) {
		for (int k=0; k<lengthPermutation; k++) {
			if (permutation[k] == index) {
				indicesOfSortedPermutIndices[index] = k;
				break;
			}
		}			
		index++;
	}	
	//==> indicesOfSortedPermutIndices = {4,8,1,10,2,9,5,0,3,7,6}
	
	
	//store text in arrays
	for (int i=0; i<numberOfArrays; i++) {
		Character[] nextArray;
		if (i == (numberOfArrays-1)) {
			nextArray = new Character[finalArrayLength];
		} else {
			nextArray = new Character[lengthPermutation];
		}
		
		for (int j=0; j<nextArray.length; j++) {
			nextArray[j] = klarText.charAt(j + (i*lengthPermutation));
		}
		
		splittedText.add(nextArray);
	}
	
	//print splitted text	
	for (int i=0; i<lengthPermutation; i++) {
		for (Character[] chars: splittedText) {
			if (chars.length > indicesOfSortedPermutIndices[i])
				System.out.print(chars[indicesOfSortedPermutIndices[i]]);
		}
	}
}

//=>> oigaehlsewrHtldei?
```


----------



## HazlNut (22. Nov 2013)

Supergeile Lösung und supergeil zu verstehen! 

Danke dir vielmals!


----------

