Doppeltverkettete Listen + Text

Psynox

Mitglied
Grüße euch,

erstmal voraus wünsche ich ein frohes Neues 2011.

Nun direkt zu meinem Anliegen. Ich muss mithilfe einer doppelt verketteten Liste einen Text editieren können. Mein Problem ist nun, wie bekomme ich einen Text mit Absätzen etc. in einen doppelt verkettete Liste?

Example:

Ich bin ein Text.
Bestehend aus mehreren Zeilen

und noch weiteren Zeilen
und so weiter.

Mir ist das insofern klar das jeder Knoten in der Liste eine Zeile repräsentiert doch wie bekomme ich das elegant gelöst?

Ich hoffe ihr könnt mir weiterhelfen.
 
Also die Frage ist etwas schwammig, was sollen wir dir jetzt darauf antworten, bzw. was erwartest du als Antwort? 🙂
Reden wir von einer doppelt-verketteten Liste aus dem JDK? Von einer eigenen Implementierung ? Und wo genau besteht jetzt das Problem? Ein Knoten besteht aus Vorderknoten, nächster Knoten + Element, wobei das Element = ein String sein könnte = eine Zeile

???:L
 
Vielleicht hilft die Angabe weiter.

Schreiben Sie die Klassen Line und Text, die eine Text-Zeile bzw. einen gesamten Text bestehend aus Text-Zeilen repräsentieren sollen.

Zusätzlich soll es für die aktuelle Position im Text beim Editieren eine Klasse Cursor geben.
Überlegen Sie sich, wie Sie den Cursor in Beziehung zu den anderen Klassen setzen und schreiben Sie entsprechende Methoden zum Positionieren des Cursors und auch zum relativen Verschieben des Cursors (z. B. ein Zeichen nach rechts, eine Zeile nach oben). Diskutieren Sie verschiedene Möglichkeiten der Kapselung und wählen Sie die nach Ihrer Meinung beste aus (z. B. ist das Cursor-Objekt für den Benutzer sichtbar oder "hinter" Text "versteckt"?)

Realisieren Sie außerdem gezielt Methoden in Ihren Klassen, die folgendes Verhalten unterstützen:

* Rückgabe des gesamten Textes als String (bei größeren Texten evtl. beschränken auf eine bestimmte Zeilenzahl).
* Rückgabe der Zeile unter dem Cursor als String.
* Löschen des Zeichens unter dem Cursor.
* Ersetzen des Zeichens unter dem Cursor durch ein neues Zeichen (spezifiziert als Übergabeparameter).
* Einfügen eines Zeichens (Übergabeparameter) bzw. einer Zeichenfolge an der aktuellen Cursor-Position.
* Erfragen der Zeilennummer, bzw. der exakten Position des Cursors.
* Löschen der gesamten Zeile unter dem Cursor.
* Einfügen einer neuen Zeile (mit spezifiziertem Inhalt) vor dem Cursor.
* Erfragen der Länge der Zeile, auf der der Cursor steht (Zahl der Zeichen!).
* Erfragen der Länge des gesamten Texts.

Überlegen Sie die für diese Zwecke erforderlichen Attribute, definieren Sie geeignete Konstruktoren für die Klassen, und sorgen Sie dafür, daß eine sinnvolle Aufgabenteilung zwischen den Klassen entsteht.
Berücksichtigen Sie insbesondere das Prinzip "Kapselung".

Zur Speicherung der Zeichenfolge einer Zeile (in der Klasse Line) verwenden Sie nunmehr sinnvollerweise ein String-Objekt, zur "Manipulation" der Zeileninhalte somit Stringmethoden bzw. wo sinnvoll auch die Klasse StringBuffer (bzw. StringBuilder) und ihre Methoden.

Als Speichermodell für die Klasse Text soll eine doppelt verkettete Liste verwendet werden. Dabei könnte es hilfreich sein, jeweils ein Dummy-Element am Anfang und Ende der Liste zu verwenden.

Stellen Sie, bevor Sie mit der Codierung beginnen, die Zusammenhänge in einem Klassendiagramm dar. Wenn Sie ein geeignetes Tool dafür verwenden, können Sie daraus den Coderahmen für Ihre Klassen generieren lassen. Erstellen Sie exemplarisch für den Use-Case "Löschen des Zeichens unter dem Cursor" ein Sequenzdiagramm.

Schreiben Sie eine weitere Klasse, die als Testrahmen zum Austesten der in den Klassen Line, Cursor, und Text implementierten Methoden dient, indem Sie dort in einer sinnvollen Reihenfolge die Methoden der Klasse mit adhoc-gewählten Parametern aufrufen.

Gehen Sie bei der Entwicklung so vor, dass Sie erst isoliert die Klassen Line und Cursor, entwickeln und austesten, und erst anschließend die Klasse Text in Angriff nehmen.

So mein Problem ist das ich keinerlei Ahnung habe wie ich das mit einem kompletten Text anstellen soll in Kombination mit einer doppelt verketteten Liste.

Folgender Code ist für die oben genannte Liste:

Java:
public class LinkedList {

	private ListElement listHead;
	private ListElement listTail;
	
	public LinkedList() {
		listHead = new ListElement();
		listTail = listHead;
	}
	
	public void push(String str){
		ListElement newElem = new ListElement();
		newElem.data = str;
		
		listTail.next = newElem;
		newElem.prev = listTail;
		
		listTail = newElem;		
	}
		
	public String pop(){
		String ret = listTail.data;
		listTail.prev.next = null;
		listTail = listTail.prev;
		return ret;
	}
	
	public int getSize(){
		int counter = 0;
		ListElement zeiger = listHead;
		while(zeiger.next != null){
			counter++;
			zeiger = zeiger.next;
		}
		return counter;
	}

	private ListElement get(int pos){
		ListElement zeiger = listHead;
		int counter = -1;
		while(zeiger.next != null && counter < pos){
			counter++;
			zeiger = zeiger.next;
		}
		return zeiger;
	}
	
	public void insert(String s, int pos){
		int size = getSize();
		if (pos > size){
			throw new RuntimeException("out of bounds");
		}
		ListElement insPos = get(pos);
		
		ListElement newElem = new ListElement();
		newElem.data = s;
		
		newElem.prev = insPos;
		newElem.next = insPos.next;
		
		insPos.next = newElem;
		newElem.next.prev = newElem;
	}	
}

Ich möchte nun einen Text so mitgeben wie er ist mit Absätzen etc. und die Klasse "Text" soll nun selbstständig jedem Knoten eine Zeile zuweisen, da es glaube ich unkomfortabel ist jede Zeile mit .push hinzuzufügen.

Ich hoffe das ist nun etwas verständlicher geworden.
 
Ich bin mir nicht ganz so sicher, ob ich Deine Frage richtig verstanden habe, daher schreibe ich einmal wie ich es machen würde. Jetzt ohne deine Hausaufgaben lösen zu wollen.

Du erstellst ein File Objekt.
Java:
File file = new File("data.txt");

Damit hast Du schon mal ne Referenz auf die Datei. Mit Hilfe eines Scanner Objektes liest Du die Datei dann zeilenweise ein.
Java:
Scanner scanner = new Scanner(file);
while (scanner.hasNextLine()) { 
String line = scanner.nextLine(); 
}

Jetzt hast Du einen String genannt line, den Du in Deine Liste schieben kannst.
Wo ist das Problem?
 
Zuletzt bearbeitet:
Das ich nicht mit Scanner arbeiten darf. v.v
Mein Problem ist einfach. Das wenn ich einen mehrzeiligen Text in einer doppelverketteten Liste haben will, ich nicht weißwie ich das bewerkstelligen soll ohne es manuell selbst machen zu müssen ergo selber die Knoten mit Inhalt zu füllen dies soll wenn möglichst alleine funktionieren doch leider weiß ich nicht wie.

Hatte schonüberlegt mithilfe einer Suche nach \n aber irgendwie ging der Gedanke ins nichts.
 
Java:
	try {
		BufferedReader in = new BufferedReader(new FileReader("text.txt"));
		String line = null;
		while ((line = in.readLine()) != null) {
		       System.out.println(line); //hier die Zeile in die Linked-List schreiben
		}
	} catch (IOException e) {
		e.printStackTrace();
	}

So hat man das vor der Scanner Klasse gemacht
 

Zurück
Oben