Methoden Levy-C-Kurve

Levy-C-Kurve:
Die Levy-C-Kurve wird zunächst mit den Zeichen F, +, - gebildet.
Die Zeichenkette c(0) = F repräsentiert die Levy-C-Kurve der Ordnung 0.
Sei c(i) die Zeichenkette der Levy-C-Kurve mit Ordnung i, dann ist c(i+1) = + c(i) - - c(i) + die Zeichenkette der Levy-C-Kurve mit Ornung i + 1.
Um die Levy-C-Kurve mit F, L, R zu repräsentieren, werden zuerst die Zeichen vor dem ersten und nach dem letzten F entfernt. Da sich zwischen F immer eine gerade Anzahl sowohl an + als auch an - befindet, können diese durch L und R ersetzt werden (gleiche Anzahl von + und - hebt sich auf).

Beispiel:
Ordnung 0: F
Ordnung 1: + F - - F + → FLF
Ordnung 2: + + F - - F + - - + F - -F + + → FLFFLF
Ordnung 3: + + + F - - F + - - + F - - F + + - - + + F - - F + - - + F - - F + + + → FLFFLFRFLFFLF

Aufgabenstellung:
Benutzen Sie eine Methode, die in einem Feld von char eine Levy-C-Kurve mit Zeichen F, + , - übergeben bekommt und +, - wie oben beschrieben durch L, R ersetzt. Dabei soll kein neues Feld erzeugt, sondern das übergebene Feld so bearbeitet werden, dass es die F-L-R enthält.

Problem:
Meine Methode erstellt ein Feld für die Ordnungen 1, 2, 3 mit +, - und F. Meine Frage ist jetzt wie ich dieses Feld in ein Feld umwandle wo + und - durch L und R ersetzt werden.

Mein Code:
public class Fraktale {
public static void main(String[]args) {
int k = Integer.parseInt(args[0]); // k wird eingelesen
char check = args[1].charAt(0); // der erste Character der zweiten Eingabe wird eingelesn und in check geschrieben

if (check == 'L') { // zweite Eingabe 'L' um Levy-C-Kurve anzusprechen
if (k <= 0 || k > 20) { // überprüfe ob die Eingabe im zugelassenen Intervall liegt
System.out.println("0 < n < 20)");
System.exit(0);
}
levyc(k);
}
}

// Lévy-C-Kurve:---------------------------------------------------------------

public static void levyc(int x) {
char [] c = new char[1]; // neues Array c (C-Kurve) wird mit der Länge 1 initialisiert
c[0] = 'F'; // 0-te Folge ist 'F'
for (int i = 0; i < x; i++) { // Schleife läuft i mal durch für k-Folgen
char [] tmp = new char [2*c.length +4]; // temporäres Array tmp wird auf die Länge der neuen Folge gesetzt (c[i+1] = +ci--ci+) = 4+2*(Länge der alten Folge)
tmp[0] = '+'; // an die erste...
tmp[tmp.length-1] = '+'; // ...und letzte Stelle wird '+' geschrieben
tmp[(tmp.length/2)-1] = '-';
tmp[(tmp.length/2)] = '-'; // an die mittleren zwei Stellen wird '-' geschrieben
for (int j = 0; j < c.length; j++) { // die Werte der vorigen Folge werden in tmp geschrieben
tmp[(j+1)] = c[j]; // die Werte von tmp werden um eins versetzt und in c geschrieben
tmp[((tmp.length/2)+1)+j] = c[j]; // die gleichen Werte von tmp werden nach der halben Länge in c geschrieben
}
c = tmp;
}
for (int j = 0; j < c.length; j++){ // gebe Folge aus
System.out.print(c[j]);
}
System.out.println()
return;
}
}
 

mihe7

Top Contributor
Meine Methode erstellt ein Feld für die Ordnungen 1, 2, 3 mit +, - und F. Meine Frage ist jetzt wie ich dieses Feld in ein Feld umwandle wo + und - durch L und R ersetzt werden.

Naja, die Grundidee wäre, dass Du über das Feld iterierst, dabei einen Zähler verwaltest, den Du bei jedem '+' erhöhst und bei jedem '-' verringerst. Triffst Du auf ein 'F', kennst Du die Differenz und kannst entsprechend ein 'L', ein 'R' oder eben nichts ausgeben, bevor Du das 'F' schreibst. Das mal ganz grob, sollst ja auch noch was zu tun haben :)

Und bitte verwende Code-Tags (die Schaltfläche </> ganz links in der Toolbar), um Code einzufügen.
 
D
Naja, die Grundidee wäre, dass Du über das Feld iterierst, dabei einen Zähler verwaltest, den Du bei jedem '+' erhöhst und bei jedem '-' verringerst. Triffst Du auf ein 'F', kennst Du die Differenz und kannst entsprechend ein 'L', ein 'R' oder eben nichts ausgeben, bevor Du das 'F' schreibst. Das mal ganz grob, sollst ja auch noch was zu t
Danke für den Tipp :) Das hat soweit gut funktioniert ich bin allerdings überfragt wie ich nun die restlichen + und - aus dem Array entferne. Kann ich die einfach auf 'null' setzten so dass die nicht mehr ausgegeben werden. Allerdings ist dann ja noch die größe des Arrays ein Problem. Gibt es irgend ein elegantes Verfahren um ein Array zu verkleinern in dem man bestimmte Werte raus nimmt?
 

mihe7

Top Contributor
Nein, man kann Arrays nicht verkleinern. Das musst Du aber auch gar nicht, denn Du weißt ja, wie viele Zeichen Du im Array ersetzt hast. Sagen wir mal n Stück. Damit kannst Du z. B. einen neuen String bauen, den Du ausgibst:
Java:
System.out.println(new String(c, 0,  n));

Nachtrag: sollte das Array von außerhalb geprüft werden, müsstest Du halt ggf. mit Leerzeichen auffüllen.
 

Ähnliche Java Themen

Neue Themen


Oben