Hallo zusammen
Ich habe ein Problem mit einer Aufgabe die ich in der Uni bekommen habe.
Wir sollen ein Programm in Java schreiben mit einer Klasse Texttrenner welche einen Text anhand bestimmter Trennzeichen in Textteile trennt.
Ich habe mich natürlich auch an der Aufgabe versucht aber ich komm nicht weiter. Das Programm klappt zwar so wie es da steht aber die Trennzeichen sind ja jetzt gar nicht flexibel. D.h. wenn ich z.B. nur noch als Trenner das + hab klappt das alles nicht mehr.
Kann sein das ich mich blöd anstelle aber ich komm einfach nicht weiter vielleicht hat ja jemand einen Tipp oder Lösung für mich die mir weiterhilft.
Dazu muss ich noch sagen das wir noch nicht alles verwenden dürfen. Also zB Arrays nicht.
Java:
publicclassTexttrennerTest{publicstaticvoidmain(String[] args){Texttrenner a =newTexttrenner("--xx+-yy--abc-","-+");System.out.println(a.gibNaechstesWort());}}
Das Programm geht auch davon aus das es min 2 Trennzeichen geben muss.
Wobei Texttrenner hier nicht ganz stimmt meiner Meinung nach. Es wird (soweit ich das Programm nachvollziehen konnte) immer nur das Wort zwischen den beiden Trennzeichen ausgegeben.
ich habe Deinen Code mal laufenlassen und in das package "frageaktuell" bei mir gesetzt, was mir als erstes auffiel war, dass ja das Trennzeichen -+ in dem Code gar nicht vorkommt. Wenn e also darum geht, dass man einen Text so spaltet, dass man ein trennzeichen einer bestimmten Länge eingibt, sodass dann eben alles was nach dem Trennzeichen steht, ausgegeben wird...
...dann würde ich das so machen. Allerdings muss eventuell noch der Fall abgedeckt werden, dass das Trennzeichen so lang ist wie der zu trennende Text oder sogar länger.
Folgende Methode gibt nun, wenn das Trennzeichen im text nicht vorhandne ist, einen Leerstring zurück und alles nach dem Trennzeichen, wenn ds Trennzeichen im zu trennenden Text enthalten ist (ohne Gewähr, bitte prüfen, falls mir ein fehler unterlaufen ist):
Java:
package frageaktuell;publicclassTexttrennerTest{publicstaticvoidmain(String[] args){Texttrenner a =newTexttrenner("--xx+-yy--abc-","+-");//-+ war ja gar nicht enthalten in dem String "--xx+-yy--abc-".System.out.println(a.gibNaechstesWort());}}
Java:
package frageaktuell;publicclassTexttrenner{privateString zeichenkette;privateString trennzeichen;privateint pointer;publicTexttrenner(String kette,String trenner){
zeichenkette = kette;
trennzeichen = trenner;
pointer =0;}//Die Instanzvariablen brauchen getter und setter.publicStringgetZeichenkette(){return zeichenkette;}publicvoidsetZeichenkette(String zeichenkette){this.zeichenkette = zeichenkette;}publicStringgetTrennzeichen(){return trennzeichen;}publicvoidsetTrennzeichen(String trennzeichen){this.trennzeichen = trennzeichen;}//publicStringgibNaechstesWort(){int start=0;//int ende; brauchen wir gar nicht.//Ich gehe davon aus, dass es eben ein Trennzeichen gibt, das kann in diesem Programm aber beliebig lange seinm nur nicht leer - und dann soll eben das Wort gesplittet werden.... if(getTrennzeichen().isEmpty()){return"";}for(int i=0;i<getZeichenkette().length();i+=getTrennzeichen().length()){//System.out.println(getZeichenkette().substring(i,(i+getTrennzeichen().length())) + " " + getTrennzeichen());if(getZeichenkette().substring(i,(i+getTrennzeichen().length())).equals(getTrennzeichen())){
start = i;break;}}returngetZeichenkette().substring(start+getTrennzeichen().length());}}
@Shams: Wie ich schon geschrieben habe ist das Programm nicht wirklich zum Trennen geeignet sondern um alle Wörter zwischen den angegebenen Zeichen zu finden.
So sorry vielleicht wurde es falsch verstanden. Mit dem -+ sind zwei Trenner gedacht. Da könnte auch ein leerzeichen und ein punkt drin stehen. Das stand so in der aufgabe...
Also es soll da getrennt werden wo so etwas vorkommt und dann das wort ausgeben. Zum beispiel: "Hallo Forum", " " -> erstes wort "hallo" wenn man die methode nochmal aufruft soll da stehen "forum".. das klappt ja jetzt auch. Das problem ist wenn ich wie hier grade nur ein trenn-zeichen habe muss es auch klappen oder halt mehr..
Ich habe die texttrennerklasse nun derart erweitert, dass er folgendes tut. Er schaut sich jedes einzelne Zeichen im übergebenen Trennzeichenstring an, und sobald er sieht, dass im zu trennenden Wort ein solches Zeichen vorkommt, gibt er eben das "Folgewort" rechts davon aus (ohne Rücksicht darauf, ob es dort auch Trennzeichen drinne gibt) (ohne Gewähr, dies soll nur ein Denkanstoß sein):
Java:
importjava.util.*;publicclassTexttrenner{privateString zeichenkette;privateString trennzeichen;privateint pointer;publicTexttrenner(String kette,String trenner){
zeichenkette = kette;
trennzeichen = trenner;
pointer =0;}//Die Instanzvariablen brauchen getter und setter.publicStringgetZeichenkette(){return zeichenkette;}publicvoidsetZeichenkette(String zeichenkette){this.zeichenkette = zeichenkette;}publicStringgetTrennzeichen(){return trennzeichen;}publicvoidsetTrennzeichen(String trennzeichen){this.trennzeichen = trennzeichen;}publicStringgibNaechstesWort(){ArrayList<String> res =newArrayList<>();//Ich habe also mehrere Startpunkte, welche die Teilwörter begrenzen.TreeSet<Integer> start =newTreeSet<>();if(!getTrennzeichen().isEmpty()){for(char zeichen :getTrennzeichen().toCharArray()){int ind =0;for(char letter :getZeichenkette().toCharArray()){if(zeichen == letter){
start.add(ind);}
ind++;}}}for(Integer s : start){//System.out.println(s);
res.add(getZeichenkette().substring(s+1));}return res.toString();}}
Also ich weiß nicht ob es schon zuspät ist aber ich habe das einfach anders gelöst.
Ich erzeuge ein Array in dem die Position der möglichen Splitter in den eingegeben Satz gespeichert werden. Danach lasse ich einfach nur noch diese eingeschlossenen bereiche ausgeben und Fertig. Dieser Code Funktioniert einwandfrei allerdings bin ich schon sehr weit von dem gegeben Ansatz weg :bahnhof:
Java:
packageZeichentrenner;importjava.util.ArrayList;importjava.util.List;publicclassZeichenstrenner{publicstaticvoidmain(String[] args){newZeichenstrenner("--++Haus++Baum-Auto+","-+");//Übergibt wie bekannt Satz und Splitter}privateString sentence;//Satz der Getrennt werden sollprivatechar[] splitter;//Array der möglichen SplitterprivateList<Integer> splitterPosition=newArrayList<Integer>();//Positionen der möglichen Splitter im Satzprivateint position=0;//Position im Array des momentanen WortespublicZeichenstrenner(String sentence,String splitter){this.sentence=sentence;this.splitter=splitter.toCharArray();generateSplitterPositions();ausgabe();}/*
* Generiert die Positionen der Splitter in dem er im Satz nach den angegeben Splittern sucht un diese Speichert
*/privatevoidgenerateSplitterPositions(){for(int i=0;i<sentence.length();i++){char c=sentence.toCharArray()[i];for(char d:splitter){if(c==d)
splitterPosition.add(i);}}System.out.println("Splitter Positions found: "+splitterPosition.toString());}/*
* Gibt die wörter aus bis es keine mehr gibt und die Methode hasNextWord() false ist
*/privatevoidausgabe(){String word=getNextWord();while(hasNextWord()){System.out.println(word.isEmpty()?"Word: <isEmpty>":"Word: "+word);
word=getNextWord();}System.out.println("No more Words left");}/*
* Gneriert eine Substring von der im SplitterPostion angeben postition zur nächsten in diesem Array angegeben Position
*/privateStringgetNextWord(){System.out.println("Splitter Position: "+position);String word=sentence.substring(splitterPosition.get(position), splitterPosition.get(position+1)+1);for(char c:splitter){
word=word.replace(c+"","");//Substring ist immer mit den Splittern die es einschließen also diese Löschen}System.out.println("Next Word from: "+splitterPosition.get(position)+" to "+splitterPosition.get(position+1));
position++;return word;}privatebooleanhasNextWord(){if(splitterPosition.size()>1&&splitterPosition.size()>position+1)returntrue;returnfalse;}}