Diana Lange Generative Gestaltung Komplexe Datentypen: String
einführung In diesem Foliensatz geht es um den Datentyp String. Die Darstellung von Schrift wird in einem gesonderten Foliensatz behandelt: http://diana-lange.de/content/files/gg_hawk_ss26/17_komplexedatentypen_pfont.pdf In Variablen von diesem Datentyp werden Zeichenketten (z.b. Wörter, Sätze, usw.) mit beliebiger Länge abgelegt. Da Zeichenketten häufig in der Programmierung benötigt werden, gibt es für sie eine spezielle Initalisierung. Beachte: Zeichenketten werden mit doppelten Anführungszeichen umrahmt.
einführung In diesem Foliensatz geht es um den Datentyp String. Die Darstellung von Schrift wird in einem gesonderten Foliensatz behandelt: http://diana-lange.de/content/files/gg_hawk_ws15/15_komplexedatentypen_pfont.pdf In Variablen von diesem Datentyp werden Zeichenketten (z.b. Wörter, Sätze, usw.) mit beliebiger Länge abgelegt. Da Zeichenketten häufig in der Programmierung benötigt werden, gibt es für sie eine spezielle Initalisierung. Beachte: Zeichenketten werden mit doppelten Anführungszeichen umrahmt. Da der Datentyp String zu den Komplexen Datentypen gehört, gibt es aber auch eine andere Möglichkeit der Initalisierung. String txt = new String("Hallo Welt"); vergleiche: PVector meinvektor = new PVector(10, 15);
ZeichenKetten ZusammenFÜhren Der einzige Rechenoperator, der auch für Strings zulässig ist, ist das Pluszeichen. Im Kontext von Strings hat das Plus aber eine andere Bedeutung: Mit dem Plus werden Zeichenketten zusammengefügt; es wird eine zusammgesetzte Zeichenkette gebildet. Man spricht dabei von Konkatenation. String h = "Hallo"; String w = " Welt"; String ausgabe = h + w; // ausgabe hat jetzt den Wert "Hallo Welt"
typumwandlung Die Umwandlung in einen String ist am einfachsten. Denn sobald ein String schon einen Inhalt hat, kann ein Element mit einem beliebigen Datentyp einfach mit einem Plus hinzugefügt werden. int zahl = 42: String antwort = zahl + " ist die Antwort"; // ergibt "42 ist die Antwort"
typumwandlung Die Umwandlung in einen String ist am einfachsten. Denn sobald ein String schon einen Inhalt hat, kann ein Element mit einem beliebigen Datentyp einfach mit einem Plus hinzugefügt werden. int zahl = 42: String antwort = zahl + " ist die Antwort"; // ergibt "42 ist die Antwort" Wenn der String, den man erstellen möchte, nur die Zahl selber beinhalten soll, dann kann man einfach einen leeren String hinzufügen. String wort = "" + 4; // ergibt "4" Was nicht geht: String zahlalsstring = 5.55;
String String "" String("") String(char[] einzelzeichen) // keine Attribute int length() char charat(int index) boolean contains(string lookup) boolean contains(char lookup) boolean equals(string comparestring) int indexof(string s) String replace(char oldchar, char newchar) void replaceall (String s, String t) String substring(int beginindex, int endindex) String tolowercase() String touppercase() Hier gezeigt ist ein Ausschnitt der Methoden, die String mitliefert. Weitere Infos gibt es unter https://docs.oracle.com/javase/7/docs/api/java/lang/string.html Generative Gestaltung. Nature. SoSe 2016. diana lange. hawk@diana-lange.de
String length() und charat() Die Zeichen einer Zeichenkette sind durchnummeriert: "Hallo Welt" 01234 56789 Generative Gestaltung. Nature. SoSe 2016. diana lange. hawk@diana-lange.de
string length() und charat() Die Zeichen einer Zeichenkette sind durchnummeriert: "Hallo Welt" 01234 56789 Über diese Nummerierung (index) kann man aus einer Zeichenkette ein einzelnes Zeichen extrahieren. char anfang = txt.charat(0); char foo = txt.charat(6); // 'h' // 'w' Achtung! Wie bei Arrays ist ein Zugriff auf einen Index, der nicht existiert, nicht möglich. println("fehler: " + txt.charat(10)); // FEHLER - OUT OF BOUNDS
string length() und charat() Die Zeichen einer Zeichenkette sind durchnummeriert: "Hallo Welt" 01234 56789 10 Zeichen Mit der Methode length() kann die Länger einer Zeichenkette (Anzahl von Zeichen) bestimmt werden println(txt.length()); // Ausgabe: 10 int letzterindex = txt.length() - 1; char letzteszeichen = txt.charat(letzterindex); println(letzteszeichen); // Ausgabe: 't'
string length() und charat() Mit den Methoden length() und charat() und einer Schleife kann man eine Zeichenkette zeicheweise durchlaufe: int i = 0; while (i < txt.length()) { char aktuelleszeichen = txt.charat(i); println("aktuelles Zeichen: " + aktuelleszeichen); i = i + 1; } Ausgabe: "aktuelles Zeichen: h" "aktuelles Zeichen: a" "aktuelles Zeichen: l"... Beispielcode: http://www.openprocessing.org/sketch/204745
string contains() Die contains() Methode überprüft, ob ein Zeichen oder eine Zeichenkette in einem String vorkommt. Als Ergebnis wird true oder false zurückgegeben. Achtung: Es wird zwischen Groß- und Kleinschreibung unterschieden. println(txt.contains('a')); // Ausgabe: true println(txt.contains("hallo")); // Ausgabe: true boolean ueberpruefung = txt.contains("hallo"); println(ueberpruefung); // Ausgabe: false
string equals() Die equals() Methode überprüft, ob zwei Zeichenketten identisch sind. Zwei Zeichenketten sind identisch, wenn alle Zeichen der beiden Zeichenketten gleich sind. Als Ergebnis wird true oder false zurückgegeben. Achtung: Es wird zwischen Groß- und Kleinschreibung unterschieden. println(txt.equals("hallo Welt")); // Ausgabe: true String hallowelt = "hallo welt"; if (txt.equals(hallowelt)) { // Nope - Bedingung ist false }
string indexof() Die indexof() Methode überprüft, ob ein Zeichen oder eine Zeichenkette in einem String vorkommt. Als Ergebnis wird die Position (Index) zurückgegeben, an der der Suchstring (zum ersten Mal) gefunden wurde oder -1, wenn der Suchstring nicht im Ursprungsstring enthalten ist. Achtung: Es wird zwischen Groß- und Kleinschreibung unterschieden. println(txt.indexof("welt")); // Ausgabe: 6 int index = txt.indexof('l'); println(index); // Ausgabe: 2 String foo = "xzy"; println(txt.indexof(foo)); // Ausgabe: -1 Beispielcode: http://www.openprocessing.org/sketch/146415
string replace() Die replace() Methode ersetzt ein Zeichen mit einem anderen Zeichen. Als Ergebnis wird ein neuer, geänderter String zurückgegeben, String geandert = txt.replace('l', 'x'); println(geandert); // Ausgabe: "Haxxo Wext"
string replaceall() Die replaceall() Methode ersetzt eine (Teil-)Zeichenkette mit einem anderen (Teil-)Zeichenkette in einem String. Als Ergebnis wird ein neuer, geänderter String zurückgegeben, String geandert = txt.replaceall("l", "xyz"); println(geandert); // Ausgabe: "Haxyzxyzo Wexyzt"
string substring() Die substring() Methode extrahiert eine Teilzeichenkette aus einer Zeichenkette. Als Ergebnis wird ein neuer String zurückgegeben. Als Paramter werden zwei Indexe (int) übergeben. Der erste Parameter bestimmt das erste Zeichen, das in der Teilzeichenkette enthalten sein soll; der zweite Parameter bestimmt das Ende (so dass das Zeichen an dieser Position nicht mehr enthalten ist). Hallo Welt 01234 56789 String teilzeichenkette = txt.substring(0, 5); println(teilzeichenkette); // Ausgabe: "Hallo" String ende = txt.substring(8, txt.length()); println(ende); // Ausgabe: "lt"
string tolowercase() & touppercase() Die Methoden tolowercase() und touppercase() wandeln den aktuellen String in Klein- bzw. Großbuchstaben um und gibt den umgewandelten String zurück. String klein = txt.tolowercase(); String gross = txt.touppercase(); println(txt); println(klein); println(gross); // Ausgabe: "Hallo Welt" // Ausgabe: "hallo welt" // Ausgabe: "HALLO WELT"
Escape Zeichen Um bestimmte Zeichen in Strings oder chars darzustellen, ist es notwendig diese zu maskieren Dies ist beispielsweise der Fall, wenn man Zeichen darstellen will, die eine spezielle Bedeutung haben (z.b. Hochkommata - die für gewöhnlich Anfang und Ende des Strings markieren) oder auch gar nicht dargestellt werden (z.b. Zeilenumbruch). Diese Zeichen werden durch so genannte Escape-Sequenzen dargestellt. Quelle: http://www.java-blog-buch.de/0304-escape-sequenzen/ Die Kombination \n (Backslash n) in einem String erzeugt einen Zeilenumbruch. Weitere Escape Zeichen sind unter der oben beigefügten Quelle zu finden. String ausgabe = "hallo\nwelt"; hallo Welt Die Kombination \" (Backslash Hochomma) in einem String wird als Hochkomma dargestellt. String ausgabe = "hallo\"welt\""; hallo "Welt" Generative Gestaltung. Nature. SoSe 2016. diana lange. hawk@diana-lange.de
Anwendingsbeispiel Lindenmayer-System Lindenmayer-Systeme (L-Systeme) sind grammatische Modelle zur Erstellung realisitischer Pflanzenstrukturen. Benannt wurden das 1968 entwickelte System nach dem Botaniker Aristid Lindenmayer. Er transformierte den regelbehafteten Aufbau von Pflanzen in ein Ersetzungssystem. In einem einfachen Beispiel wird die Funktionsweise deutlicher: Am Anfang ist das Zeichen»F«(Axiom) gegeben, welches durch die Zeichenfolge»[F+F]«ersetzt werden soll. Nach einer Ersetzung erhält man nun»f+f«, nach der zweiten»[[f+f]+[f+f]]«. Die auf diese Weise entstandene Zeichenkette wird dann als Grafik interpretiert, wobei jedem Zeichen eine explizite Bedeutung zugeordnet ist (Siehe nächste Folien) Generative Gestaltung. Nature. SoSe 2016. diana lange. hawk@diana-lange.de
Anwendingsbeispiel Lindenmayer-System Ausgangssituation: Axiom: F Ersetzungsregeln: F -> [F+F] Das Axiom ist die Zeichenkette, die am Anfang gegeben ist. Die Ersetzungsregeln bestimmen welche Zeichen mit welchen anderen Zeichen ersetzt werden soll. F [F+F] [[F+F]+[F+F]] [[[F+F]+[F+F]]+[[F+F]+[F+F]]]... // Axiom // erste Ersetzung // zweite Ersetzung // dritte Ersetzung Generative Gestaltung. Nature. SoSe 2016. diana lange. hawk@diana-lange.de
Anwendingsbeispiel Lindenmayer-System Im Lindenmayer-System repräsentiert jedes Zeichen eine bestimmte grafische Komponente. In dieser Tabelle finden sich alle vereinheitlichten Zeichen und ihre Bedeutung. Natürlich ist es problemlos möglich, weitere Zeichen und Bedeutungen hinzuzufügen. So könnte beispielsweise das System um das Zeichen»B«für Blühte zeichnen und»l«für Blatt zeichnen erweitert werden. Zeichen Bedeutung F Vorwärtsbewegung um eine Linienlänge & Zeichnen der Linie f Vorwärtsbewegung um eine Linienlänge ohne Zeichnen der Linie + Drehung nach Links um gegebenen Winkel - Drehung nach Rechts um gegebenen Winkel [ Speichern des aktuellen Zustandes (Winkel, Position, usw.) ] Zurückkehren zum vorher gespeicherten Zustand Generative Gestaltung. Nature. SoSe 2016. diana lange. hawk@diana-lange.de
Anwendingsbeispiel Lindenmayer-System Rechts: Die Zeichenkette Links: Die grafische Interpretation dieser Zeichenkette Generative Gestaltung. Nature. SoSe 2016. diana lange. hawk@diana-lange.de
Anwendingsbeispiel Lindenmayer-System Je nach Axiom und Ersetzungsregeln ändert sich die Gestalt der Pflanze. Generative Gestaltung. Nature. SoSe 2016. diana lange. hawk@diana-lange.de
Anwendingsbeispiel Lindenmayer-System Weitere L-Systeme: Axiom: Ersetzungsregeln: X F -> FF X -> F-[[X]+X]+F[+FX]-X Axiom: Ersetzungsregeln: X F -> FF X -> F[+X]F[-X]+X Axiom: Ersetzungsregeln: F F -> FF+[+F-F-F]-[-F+F+F] Axiom: Ersetzungsregeln: F F -> F[+FF][-FF]F[-F][+F]F Axiom: Ersetzungsregeln: F F -> F[-F]F[+F][F] Generative Gestaltung. Nature. SoSe 2016. diana lange. hawk@diana-lange.de