# StringBuffer



## Lukases2 (21. Jan 2015)

Aufgabe: Anwesenheitslisten
Bisher wurde die Anwesenheitsliste eines Kurses in einem Textdokument abgespeichert (Datei
anwesenheit.txt in Ilias). Da die Teilnehmerzahlen allerdings stetig steigen ist dieses Vorgehen
nichtmehr durchführbar. D.h. die Daten müssen in eine praktische Datenstruktur übertragen werden.
Beachten Sie dabei folgende Hinweise:
1.Verwalten Sie jeden Kursteilnehmer als Person in einer LinkedList in der Klasse DateiVerwalten.
Dazu wurde die Klasse Person bereits implementiert:

```
public class Person {
private String vorname, nachname;
private boolean anwesend;
public String getName(){
if (anwesend) return vorname+" "+nachname+" ist anwesend.";
else return vorname+" "+nachname+" ist nicht anwesend.";
}
public void setAttribut(int zaehler, String name){
if (zaehler == 1) vorname = name;
if (zaehler == 2) nachname = name;
if (zaehler == 3 && name.charAt(0) == '+') anwesend = true;
else anwesend = false;
}
}
```
2. Schreiben Sie eine Methode listeLesen(). Diese soll über einen FileReader die Zeichenketten
des Textdokuments bis zum Ende Schritt für Schritt als int c einlesen. Prüfen Sie dazu:
i. Zeilenumbrüche: '\n'
ii. Leerzeichen: ' '
iii. relevante Buchstaben:
(c >= 'A' && c <= 'Z')||(c >= 'a' && c <= 'z')||(c=='+')||(c=='-')
Verwenden Sie einen StringBuffer, um die Zeichenketten zu rekonstruieren. Sobald ein
Leerzeichen auftritt ist ein Wort vollständig und kann einem Person-Objekt hinzugefügt werden.
(Nutze hier die bereits implementierte Logik von setAttribut in Person)
Am Ende jeder Zeile wurden alle Informationen zu einer Person gesammelt und das Person-Objekt
kann der Liste hinzugefügt werden um die nächste Person zu erstellen.
3. Schreiben Sie eine Methode listeAusgeben(), welche die LinkedList sinnvoll ausgibt.
Tipps:
s.append((char)c) fügt int-Wert c einem StringBuffer s hinzu.
s.toString() macht aus einem StringBuffer s einen normalen String.


Das hier habe ich bis jetzt geschrieben:


```
package niepack;

import java.io.FileReader;
import java.io.IOException;
import java.util.LinkedList;

public class Person {
	
	private String vorname, nachname;
	private boolean anwesend;
	
	public String getName(){
		if(anwesend){
			return vorname +" " +nachname+" ist anwesend.";
		}else{
			return vorname + " " + nachname + " ist nicht anwesend";
		}
	}
	
	public void setAttribut(int zaehler, String name){
		if(zaehler == 3){
			vorname = name;
		}
		if(zaehler == 2){
			nachname = name;
		}
		if(zaehler == 1 && name.charAt(0) == '+'){
			anwesend = true;
		}
	}
	
	public String dateiLesen(){
		String s = "";
		
		FileReader reader = null;
		
		try{
			reader = new FileReader("anwesenheit.txt");
			
			int c = reader.read();
			
			while(c != -1){
				s = s + (char)c;
				c = reader.read();
			}
			
			reader.close();
		}catch(IOException e){
			e.printStackTrace();
		}
		
		return s;
	}
	
	public static void main(String[] args) {
		
		StringBuffer buffer = new StringBuffer();
		
		LinkedList<StringBuffer> liste = new LinkedList<StringBuffer>();
		
	}

}
```

Die (externe .txt-)Liste kann bereits lesen/ausgeben lassen. 
Jetzt muss ich ja immer dann, wenn ein Leerzeichen gelesen wird, eine neue Person hinzufügen. Doch damit habe ich jetzt meine Probleme. Eines davon ist, dass ich die Name als String einlese, sie aber als StringBuffer brauche. 
Kann mir da jemand helfen?


----------



## VfL_Freak (21. Jan 2015)

Moin,

was genau suchst du?
Etwa sowas?

```
StringBuilder mySB = new StringBuilder();
mySB.append( eingelesenerString);
```

Gruß Klaus


----------



## Lukases2 (21. Jan 2015)

Ich suche eine Möglichkeit, die einzelnen Personen auch als solche festzulegen. Jetzt weiß ich nicht, wie ich das mit StringBuffer hinbekommen soll. Die Idee ist ja, die Leerzeichen zu zählen und wie in setAttribut() bereits implementiert dann in eine LinkedList zu überführen. Wie kann das gehen?


----------



## Flown (21. Jan 2015)

Ich hab dir hier mal ein analoges Beispiel gebastelt, wie man sowas lösen könnte (Achtung jdk > 1.7 wegen try-with-resource).


```
import java.io.IOException;
import java.io.StringReader;
import java.util.LinkedList;
import java.util.List;

public class Test {
  private String s = "19\n\n28\n37\n46\n55\n6\n7\n8\n9\n";
  
  public List<Integer> readInteger() {
    List<Integer> list = new LinkedList<Integer>();
    try (StringReader sr = new StringReader(s)) {
      StringBuilder builder = new StringBuilder();
      for (int ch = sr.read(); ch != -1; ch = sr.read()) {
        char c = (char) ch;
        if ('0' <= c && c <= '9') {
          builder.append(c);
        } else if (c == '\n' && builder.length() != 0) {
          list.add(Integer.valueOf(builder.toString()));
          builder.setLength(0);
        }
      }
    } catch (IOException e) {
      e.printStackTrace();
    }
    return list;
  }
  
  public static void main(String... args) {
    Test t = new Test();
    List<Integer> list = t.readInteger();
    System.out.println(list);
  }
}
```

Besser den StringBuilder benutzen, da dieser nicht synchronisiert werden muss.


----------



## Lukases2 (21. Jan 2015)

Ich muss leider zugeben, dass ich da nichts verstehe. Ist das nicht so einfach, wie ich mir das vorstelle? ich möchte ja die einzelnen Zeichen einlesen, wenn sie Leerzeichen sind, den Namen der LinkedList übergeben.


----------

