Ich habe da ein Problem bei der Zerlegung eines Textes in seine einzelnen Komponenten. Für die Zerlegung sollen Komposit- und Komponenten-Klassen verwendet werden. Ich habe mir dazu folgenden Lösungsansatz ausgedacht. Zuerst zerlege ich den Text in die einzelnen Sätze. Mit dem Punkt als Satztrenner ist das ja kein Problem. Die Sätze speichere ich als Elemente in einer Arrayliste. Als nächstes benutze ich das Leerzeichen, um die einzelnen Wörter eines Satzes in ein Stringarray zu extrahieren. Das hat auch noch geklappt. Was mich jedoch verwundert ist, dass bei der Ausgabe der Komponenten, also den Wörtern im Stringarray, über eine Methode getText() abhängig von einer Laufvariablen die Ausgabe der Komponenten dubliziert wird. Bei der Ausgabe der Komposits passiert das nicht, wodurch ich vermute, dass etwas beim Aufruf und der Definition der Methode getText() schief läuft. Stört da vielleicht, dass ich sowohl in der Klasse Clients, als auch in der Klasse Kompositum über die ChildComponents in einer foreach-Schleife iteriere? Wenn da der Fehler liegt, welche der beiden foreach-Schleifen kann ich mit was ersetzen?
Anbei die relevanten Klassen:
TextChild.java:
Component.java
Kompositum.java
Client.java (enthält die main-Methode)
Weniger relevant für das Problen, denn mit den Komposite-Derivaten klappt alles, aber zur Vollständigkeit noch die Klassen
ArticlePlusNomen.java
und Sentence.java
Als Ausgabe erhalte ich:
[Der Hamster liebt das Rad, Der Hund begehrt die Wurst]
Der
Hamster
liebt
das
Rad
[Der, Hamster]
[das, Rad]
[Der, Hamster, liebt, das, Rad]
Der
Hund
begehrt
die
Wurst
Der
Hund
begehrt
die
Wurst
[Der, Hund]
[die, Wurst]
[Der, Hund, begehrt, die, Wurst]
Das was weg soll habe ich fett markiert. Ich gebs zu ist ziemlich viel Programmcode, aber vielleicht steigt da ja jemand durch und hat eine Idee, wie ich den Fehler beheben kann.
Anbei die relevanten Klassen:
TextChild.java:
Java:
public interface TextChild {
void setText(String text);
String getText();
}
Component.java
Java:
class Component implements TextChild {
String text;
public void setText(String text) {
this.text = text;
}
public String getText() {
return text;
}
}
Kompositum.java
Java:
import java.util.*;
class Kompositum {
String text;
// hier: Components als Liste vorgehalten
public List<TextChild> childComponents = new ArrayList<TextChild>();
// rekursiver Aufruf auf childComponents
public String getText() {
for (TextChild childComps : childComponents) {
childComps.getText();
}
return text;
}
// Überschreiben der Default-Implementierung
public void add(TextChild pComp) {
childComponents.add(pComp);
}
public void remove(TextChild pComp) {
childComponents.remove(pComp);
}
public TextChild getChild(int pIndex) {
return childComponents.get(pIndex);
}
}
Client.java (enthält die main-Methode)
Java:
import java.util.*;
public class Client {
public static ArrayList<String> al = new ArrayList<String>();
public final static String text = "Der Hamster liebt das Rad. Der Hund begehrt die Wurst.";
public static Component subjectArticle = new Component();
public static Component subjectNomen = new Component();
public static Component verb = new Component();
public static Component objectArticle = new Component();
public static Component objectNomen = new Component();
public static Kompositum kompositum = new Kompositum();
public static void main (String[] args) {
// This is the block of text to process.
String block = text;
// Loop over all sentences.
while (!block.equals("")) {
// Remove leading spaces
if (block.startsWith(" ")) {
block = block.substring(1);
continue;
}
// Find end of sentence
int end = block.indexOf('.');
// Extract sentence and remove it from the text block
String sentence = block.substring(0, end);
al.add(sentence);
block = block.substring(end+1);
}
System.out.println(al);
Iterator itr = al.iterator();
while (itr.hasNext()) {
Object element = itr.next();
// Split sentence at whitespace into array
String[] stringarr = ((String)element).split("\\s+");
// Process each starting word.
for (int i = 1; i < stringarr.length; i++) {
subjectArticle.setText(stringarr[0]);
subjectNomen.setText(stringarr[1]);
verb.setText(stringarr[2]);
objectArticle.setText(stringarr[3]);
objectNomen.setText(stringarr[4]);
}
kompositum.add(subjectArticle);
kompositum.add(subjectNomen);
kompositum.add(verb);
kompositum.add(objectArticle);
kompositum.add(objectNomen);
// Einfache Nutzung der Struktur
for (TextChild childComps : kompositum.childComponents) {
System.out.println("" + childComps.getText());
}
ArticlePlusNomen subject = new ArticlePlusNomen(subjectArticle, subjectNomen);
ArticlePlusNomen object = new ArticlePlusNomen(objectArticle, objectNomen);
Sentence sen = new Sentence(subjectArticle, subjectNomen, verb, objectArticle, objectNomen);
System.out.println("" + subject.getList());
System.out.println("" + object.getList());
System.out.println("" + sen.getList());
}
}
}
Weniger relevant für das Problen, denn mit den Komposite-Derivaten klappt alles, aber zur Vollständigkeit noch die Klassen
ArticlePlusNomen.java
Java:
import java.util.*;
class ArticlePlusNomen extends Kompositum {
private TextChild _article, _nomen;
private List<String> al = new ArrayList<String>();
ArticlePlusNomen(TextChild article, TextChild nomen) {
_article = article;
_nomen = nomen;
}
// rekursiver Aufruf auf childComponents
public List<String> getList() {
al.add(_article.getText());
al.add(_nomen.getText());
return al;
}
}
und Sentence.java
Java:
import java.util.*;
class Sentence extends Kompositum {
private TextChild _articlesubj, _nomensubj, _verb, _articleobj, _nomenobj;
private List<String> al = new ArrayList<String>();
Sentence(TextChild articlesubj, TextChild nomensubj, TextChild verb, TextChild articleobj, TextChild nomenobj) {
_articlesubj = articlesubj;
_nomensubj = nomensubj;
_verb = verb;
_articleobj = articleobj;
_nomenobj = nomenobj;
}
// rekursiver Aufruf auf childComponents
public List<String> getList() {
al.add(_articlesubj.getText());
al.add(_nomensubj.getText());
al.add(_verb.getText());
al.add(_articleobj.getText());
al.add(_nomenobj.getText());
return al;
}
}
Als Ausgabe erhalte ich:
[Der Hamster liebt das Rad, Der Hund begehrt die Wurst]
Der
Hamster
liebt
das
Rad
[Der, Hamster]
[das, Rad]
[Der, Hamster, liebt, das, Rad]
Der
Hund
begehrt
die
Wurst
Der
Hund
begehrt
die
Wurst
[Der, Hund]
[die, Wurst]
[Der, Hund, begehrt, die, Wurst]
Das was weg soll habe ich fett markiert. Ich gebs zu ist ziemlich viel Programmcode, aber vielleicht steigt da ja jemand durch und hat eine Idee, wie ich den Fehler beheben kann.