Fragen zu String durchsuchen und verarbeiten

naserddin

Mitglied
Hallo zusammen. Ich habe die Aufgabe, in einem bestimmten String nach mehreren Trennzeichen zu suchen und nach jedem Ziffer wird der folgende Text in eine neue Zeile weitergeschrieben.

die Aufgabenstellung lautet :

Eine void set(String Ueberschrift, String Saetze)-Methode:
Hier wird der übergebenen Text im Vorfeld formatiert und anschließend in das textField -Attribut abgelegt, wie folgend beschrieben:
o Zur Ermittlung der textField-Länge wird zuerst nach den zugelassenen Satz-Trennzeichen - wie , ; oder : - im Text Saetze gesucht und die Gesamtzahl bestimmt. Ziel soll sein, die durch Satz-Trennzeichen getrennte Sätze in die einzelnen textField-Feldelemente zu speichern. Gesucht wird grundsätzlich bis zu dem erlaubten Textendezeichen – wie . ! oder ? -. Bei der Speicherplatzreservierung berücksichtigen Sie bitte auch die Überschrift.

das textField-Attribut habe ich so geschrieben
Java:
int index = 8;
    
      String[] textField = new String[index];

danach habe ich die methode set so angefangen
Java:
void set(String Ueberschrift, String Saetze){

    int index = Saetze.indexOf(',' , ';' , ':' +1);

    }
ich kriege aber immer fehler-Meldung.. also wie kann ich den Text nach den drei Trennzeichen suchen und zählen lassen.und nach jedem Trennzeichen die einzelnen Sätze in einzelnen textField-Feldelemente speichern. und wie kann ich bis zu einem erlaubten Textendezeichen – wie . ! oder ? suchen

für eure Hilfe wäre ich dankbar
 
Das heißt dass deine Klasse Seatze die Methode (mit den Parametern...) nicht kennt.
Poste doch mal die Klasse, bzw. die indexOf Methode.

EDIT:
Sehe grade dass Saetze ein String ist (variablen schreibt man klein!). Die indexOf Methode kann nur nach einem Zeichen suchen, also entweder ; oder , oder :
String (Java 2 Platform SE v1.4.2)
 
Die Lösung zu deinem Problem liegt im StringTokenizer. Da kannst du deinen String durch festgelegte delimiters trennen und dann in ein Array packen.

Das ganze sähe dann ungefähr so aus:
Java:
public void set(String ueberschrift, String saetze) {
		StringTokenizer tok = new StringTokenizer(saetze, ";,:.!?");
		
		textField = new String[tok.countTokens() + 1];
		
		textField[0] = ueberschrift;
		
		for(int i = 1; tok.hasMoreTokens(); i++) {
			textField[i] = tok.nextToken();
		}
	}
 
Die Lösung zu deinem Problem liegt im StringTokenizer. Da kannst du deinen String durch festgelegte delimiters trennen und dann in ein Array packen.

Das ganze sähe dann ungefähr so aus:
Java:
public void set(String ueberschrift, String saetze) {
		StringTokenizer tok = new StringTokenizer(saetze, ";,:.!?");
		
		textField = new String[tok.countTokens() + 1];
		
		textField[0] = ueberschrift;
		
		for(int i = 1; tok.hasMoreTokens(); i++) {
			textField[i] = tok.nextToken();
		}
	}

danke für die Antwort
ich habe die Methode so geschrieben. aber es kommen folgende Fehlermeldungen

Format_Text.java:35:9: cannot find symbol
symbol : class StringTokenizer
location: class Format_Text
StringTokenizer tok = new StringTokenizer(Saetze, ";,:.!?");
^
Format_Text.java:35:35: cannot find symbol
symbol : class StringTokenizer
location: class Format_Text
StringTokenizer tok = new StringTokenizer(Saetze, ";,:.!?");
^
Format_Text.java:37:47: operator + cannot be applied to StringTokenizer.countTokens,int
textField = new String[tok.countTokens() + 1];
^
Format_Text.java:37:50: incompatible types
found : <nulltype>
required: int
textField = new String[tok.countTokens() + 1];
 
Holst du dir die Klasse StringTokenizer auch mit
Java:
import java.util.StringTokenizer;
rein?
 
super danke schön.. ich versuche das ganze praktikum bis morgen hinzukriegen und wenn es noch fragen gibt wende ich mich an euch

Hallo. ich habe es heute kontrolliert und es läuft wunderbar aber ich habe ein kleines Problem
nach jedem Trennzeichen wie , oder : etc muss am Ende der Zeile das Trennzeichen selber auch stehen
zum Beispiel sieht die Ausgabe bei mir so aus
Hoppe
Hoppe
Reiter
wenn er fällt
dann schreit er
fällt er in den Sumpf
macht der Reiter plumps

aber es muss so aussehen

Hoppe,
Hoppe,
Reiter,
wenn er fällt,
dann schreit er,
fällt er in den Sumpf,
macht der Reiter plumps!

für eure Hilfe wäre ich dankbar
 
Bei folgendem Code:
Java:
StringTokenizer tok = new StringTokenizer(saetze, ";,:.!?", true);
werden die Trennzeichen als eigene Tokens mit String.lenght = 1 angelegt, die du dann ausgeben kannst.

Also sähe deine Schleife dann ungefähr so aus:
Java:
for(int i = 1; tok.hasMoreTokens(); i++) {
            textField[i] = tok.nextToken();
            textField[i] += tok.nextToken();
        }

Als Tipp: benutzte die Java Dokumentation: All Documents
 
Zuletzt bearbeitet:
Bei folgendem Code:
Java:
StringTokenizer tok = new StringTokenizer(saetze, ";,:.!?", true);
werden die Trennzeichen als eigene Tokens mit String.lenght = 1 angelegt, die du dann ausgeben kannst.

Also sähe deine Schleife dann ungefähr so aus:
Java:
for(int i = 1; tok.hasMoreTokens(); i++) {
            textField[i] = tok.nextToken();
            textField[i] += tok.nextToken();
        }

Als Tipp: benutzte die Java Dokumentation: All Documents

danke es hat wunderbar geklappt. es tritt aber in der Methode output() an der zeile sieben (hier) ein nullpointerexception
die methode :
Java:
void output(){
      System.out.print(textField[0]+"\n\n");

      for(int i=1 ; i < textField.length ; i++)
            {
               if(textField[i].charAt(0)==32)
                     System.out.println(textField[i].substring(1));
               else
               System.out.println(textField[i]);
            }
    }
 
Ja das war schwachsinn was da stand.
Fliegt die NPE wirklich in zeile 7 und nicht schon in zeile 6?

Poste die doch mal.
 
Ja das war schwachsinn was da stand.
Fliegt die NPE wirklich in zeile 7 und nicht schon in zeile 6?

Poste die doch mal.

doch du hast recht.. in Zeile 6

Exception in thread "main" java.NullPointerException
at Format_Text.output<format_Text.java63(hier 6)>
Java:
  void output(){
      System.out.print(textField[0]+"\n\n");

      for(int i=1 ; i < textField.length ; i++)
            {
               if(textField[i].charAt(0)==32)
                     System.out.println(textField[i].substring(1));
               else
               System.out.println(textField[i]);
            }
    }
at format_Text_test.main<Format_Text_test.java:48(hier 3)>
Java:
String s1 = "Hoppe, Hoppe, Reiter, wenn der faellt, dann schreit er,"+
                  " faellt er in den Sumpf, macht der Reiter plumps!"; 
Format_Text text2 = new Format_Text("Auswahl 2",s1);
                   text2.output();
 
vermute einfach, dass nicht das komplette array instanziiert ist. wobei sie dann eigentlich in zeile 6 fliegen sollte. lass dir doch mal einfach i vorher ausgeben.

for(int i=1 ; i < textField.length ; i++)
System.out.println(i);
 
so funktionierts auf jeden Fall:

Java:
import java.util.StringTokenizer;

public class StringDurchsuchen {
	private static String[] textField;
	
	public static void set(String ueberschrift, String saetze) {
		StringTokenizer tok = new StringTokenizer(saetze, ";,:.!?", true);
		
		textField = new String[tok.countTokens() + 1];
		
		textField[0] = ueberschrift;
		
		for(int i = 1; tok.hasMoreTokens(); i++) {
			textField[i] = tok.nextToken();
			textField[i] += tok.nextToken();
		}
	}
	
	public static void main(String[] args) {
		set("Über", "Hoppe,Hoppe,Reiter,wenn er fällt,dann schreit er,fällt er in den Sumpf,macht der Reiter plumps!");
	}
}
 
so funktionierts auf jeden Fall:

Java:
import java.util.StringTokenizer;

public class StringDurchsuchen {
	private static String[] textField;
	
	public static void set(String ueberschrift, String saetze) {
		StringTokenizer tok = new StringTokenizer(saetze, ";,:.!?", true);
		
		textField = new String[tok.countTokens() + 1];
		
		textField[0] = ueberschrift;
		
		for(int i = 1; tok.hasMoreTokens(); i++) {
			textField[i] = tok.nextToken();
			textField[i] += tok.nextToken();
		}
	}
	
	public static void main(String[] args) {
		set("Über", "Hoppe,Hoppe,Reiter,wenn er fällt,dann schreit er,fällt er in den Sumpf,macht der Reiter plumps!");
	}
}


bis jetzt hat es nicht geklappt mit dem NPE. hier mein ganzes Programm hoffe mir könnte jemand helfen


Java:
import java.lang.*;
import java.*;
import java.util.  StringTokenizer  ;

public class Format_Text{


    
    String[] textField;

    // Default Konstruktor:
    Format_Text(){
    textField = new String[2];
    textField[0]= "Überschrift";
    textField[1]= "------------";
    };
    
    
    // Init Konstruktor:
    Format_Text(String Ueberschrift, String Text){
      set(Ueberschrift, Text);
      headlineUpper();
    }

    void set(String Ueberschrift, String Saetze){
        StringTokenizer tok = new StringTokenizer(Saetze, ";,:.!?", true);

        textField = new String[tok.countTokens() + 1];

        textField[0] = Ueberschrift;


        for(int i = 1; tok.hasMoreTokens(); i++) {
            textField[i] = tok.nextToken();
            textField[i] += tok.nextToken();
        }
    }

    void headlineUpper(){

     textField[0] = new String(textField[0].toUpperCase());

    }
    

    void output(){


      for(int i=1 ; i < textField.length ; i++)
            {
               if(i==0)
                     System.out.println(textField[i] + "\n\n");
               else
               System.out.println(textField[i].trim());
            }
    }

    public int countBlank()
   {
       int counter=0;
       for(int i=1 ; i < textField.length ; i++)
             for(int j=0 ; j < textField[i].length() ; j++)
                     if(textField[i].charAt(j) == 32)
                             counter++;

       return counter;
   }
  }


public class Format_Text_Test {

  public static void main(String[] args) {
    String s1 = "Sagt, wer mag das Maennlein sein, mit dem kleinen schwarzen Kaeppelein?";
    String s2 = "Fuchs, du hast die Gans gestohlen, gib sie wieder her.";
    String s3 = "Hoppe, Hoppe, Reiter, wenn der faellt, dann schreit er, faellt er in den Sumpf, macht der Reiter plumps!";


    Format_Text text0 = new Format_Text(); //Default-Konstruktor
    text0.output();


    Format_Text text1 = new Format_Text("Test 1", s1); //Init-Konstruktor
    text1.output();
    System.out.println(text1.countBlank());

    Format_Text text2 = new Format_Text("Test 2", s2); //Init-Konstruktor
    text2.output();
    System.out.println(text2.countBlank());

    Format_Text text3 = new Format_Text("Hoppe, Hoppe, Reiter", s3); //Init-Konstruktor
    text3.output();
    System.out.println(text3.countBlank());

  }
}

Ich glaube der Fehler liegt in der set-Methode da man zwischen String mit Satz-Trennzeichen wie ,;: und Strings mit Text-Endzeichen wie .!? unterscheiden muss. da der Zähler in jeder Zeile bis eins der Text-Endzeichen laufen darf und dann wird beendet . aber hier in der set-Methode es läuft immer weiter glaube ich
hier die Aufgaben-Stellung nochmal
Eine void set(String Ueberschrift, String Saetze)-Methode: Hier wird der übergebenen Text im Vorfeld formatiert und anschließend in das textField -Attribut abgelegt, wie folgend beschrieben:
o Zur Ermittlung der textField-Länge wird zuerst nach den zugelassenen Satz-Trennzeichen - wie , ; oder : - im Text Saetze gesucht und die Gesamtzahl bestimmt. Ziel soll sein, die durch Satz-Trennzeichen getrennte Sätze in die einzelnen textField-Feldelemente zu speichern. Gesucht wird grundsätzlich bis zu dem erlaubten Textendezeichen – wie . ! oder ? -. Bei der Speicherplatzreservierung berücksichtigen Sie bitte auch die Überschrift.
 
Zuletzt bearbeitet:
Diese Schleife stimmt nicht:

Java:
        for(int i = 1; tok.hasMoreTokens(); i++) {
            textField[i] = tok.nextToken();
            textField[i] += tok.nextToken();
        }

Wass ist, wenn im StringTokenizer noch genau ein Token ist?
Dann ist tok.hasMoreTokens() wahr, in der nächsten Zeile wird das Token dem Feld zugewiesen, und in der folgenden Zeile ist kein Token mehr da... Bumm!
 
Diese Schleife stimmt nicht:

Java:
        for(int i = 1; tok.hasMoreTokens(); i++) {
            textField[i] = tok.nextToken();
            textField[i] += tok.nextToken();
        }

Wass ist, wenn im StringTokenizer noch genau ein Token ist?
Dann ist tok.hasMoreTokens() wahr, in der nächsten Zeile wird das Token dem Feld zugewiesen, und in der folgenden Zeile ist kein Token mehr da... Bumm!

danke ich hatte
Java:
textField[i] += tok.nextToken();
gelöscht und es hat geklappt aber alle Trennzeichen kommen dann in die nächste Zeile ZBS
Hoppe
,
Hoppe
,
Reiter
,

und sie müssen so aussehen
Hoppe,
Hoppe,
Reiter,
 
Ich würde textField zu einer List<String> machen (später kann man immer noch toArray() aufrufen) und schreiben:
Java:
for(int i = 1; tok.hasMoreTokens(); i++) {
   String s = tok.nextToken();
   textField.add(tok.hasMoreTokens() ? s + tok.nextToken() : s); 
}
 
Ich würde textField zu einer List<String> machen (später kann man immer noch toArray() aufrufen) und schreiben:
Java:
for(int i = 1; tok.hasMoreTokens(); i++) {
   String s = tok.nextToken();
   textField.add(tok.hasMoreTokens() ? s + tok.nextToken() : s); 
}

ich darf nicht mit List arbeiten
ich habe eine andere Lösung gefunden und sie lautet
Java:
void set(String Ueberschrift, String Saetze) {
      String SatzTrennen = ",;:", Textende = ".!?";
      int l = Saetze.length();
      int Zaehler=0;

      for (int i=0 ; i<l ; i++){
        if(SatzTrennen.indexOf(Saetze.charAt(i))>-1){

        Zaehler++;
         }
        else if (Textende.indexOf(Saetze.charAt(i))>-1){

        Zaehler++;
        break;
        }
      }
          textField = new String[Zaehler+1];
          int x=0;
          int y=0;


          int Zeilen=0;
          textField[Zeilen]= Ueberschrift;



      for(int i = 0; i < l; i++) {
      if( (SatzTrennen.indexOf(Saetze.charAt(i)) >-1) || (Textende.indexOf(Saetze.charAt(i)) >-1) ) {

         Zeilen++;
         y = i+1;
        textField[Zeilen] = Saetze.substring(x, y);
        x = y;
         }

      } 

    }

ich möchte das, was hier gemacht wird mit der Methode StringTokenizer oder eine andere machen.. hätte jemand eine Idee
 

Neue Themen


Zurück
Oben