2016-11-02 6 views
1

Ich arbeite an dieser Hausaufgabe für die Schule. Ich versuche herauszufinden, wie man einzelne Wörter aus einer Zeichenfolge erhält, die der Benutzer angibt. In meinem Fall sind Wörter immer durch Leerzeichen getrennt. Also zählt mein Code, wie viele Leerzeichen es gibt und macht dann Teilstrings. Bitte helfen Sie, wenn Sie können.Java Teilstring Fehler: String Index außerhalb des Bereichs

 System.out.print("Please enter a sentence: "); 
     String userSentence=IO.readString(); 

     String testWord=""; 
     int countSpaces=0; 


     for(int j=0; j<userSentence.length(); j++){ 
      if((userSentence.charAt(j))==' '){ 
       countSpaces++; 

      } 
     } 


     for(int i=0; i<userSentence.length(); i++){ 
      if(countSpaces>0){ 

       while(userSentence.charAt(i)==' '){ 
        i++; 
        countSpaces--; 
       } 

       testWord=userSentence.substring(i, userSentence.indexOf(" ")); 
       i=i+(testWord.length()-1); 

      } 

      if(countSpaces==0){ 
       testWord=userSentence.substring(i); 
       i=userSentence.length(); 
      } 

      System.out.print(testWord); 
+2

Sie zählen müssen, wie viele Räume der Satz hat und sie dann entfernen? – Giovane

+0

Ich muss zählen, wie viele Wörter es in einer gegebenen Phrase oder Satz gibt. Und Räume sind das, was zwischen Wörtern unterscheidet. Das Problem, das auftritt, ist mit testWord = userSentenceString (i, userStence.indexOf ("")); –

+0

Nun, anstatt diese Schleifen zu machen, können Sie 'split (" ")' verwenden. Wenn Sie diese Methode für einen 'String' verwenden, wird Ihr' String' in ein Array von 'Strings' zerlegt. Der 'String', den Sie als Parameter an die' split() 'Methode übergeben, ist der" break point "des' String'. Beispiel: '" testing Split wie ein Chef ".split (" ") -> [" Testen "," split "," like "," a "," Chef "]' – Giovane

Antwort

0

Da Sie nicht den gesamten Codeabschnitt liefern, werde ich nur darauf hinweisen ein Problem mit dem, was Sie gebucht haben ...

Nachfolgend finden Sie eine Ihrer for Schleife mit „i“ als Zähler ...

for(int i=0; i<userSentence.length(); i++) 
{ 
       // … Rarely (if ever) is “ i ” changed inside this loop! 
    i++;      // <--- this will cause a problem 
    i=userSentence.length(); // <--- so will this 
} 

Dies wird eingerichtet, um alle Zeichen in der userSentence Schleife durchlaufen. "i" ist die Zählervariable für die Schleife. Wenn Sie die Zählervariable "i" innerhalb der Schleife ändern (was Sie mehrmals tun), erhalten Sie höchstwahrscheinlich unerwartete Ergebnisse. "I" wird automatisch durch das Schleifenkonstrukt inkrementiert. Wenn Sie es ändern, wird die Schleife wahrscheinlich brechen oder nicht wie erwartet funktionieren.

Ihr Fehler, wenn Sie zu erhalten ...

testWord=userSentence.substring(i, userSentence.indexOf(" ")); 

ist nicht ungewöhnlich, wenn man bedenkt es nutzt "i" als Index. Nur ein Gedanke.

0

Der unten stehende Code wäre viel sauberer, wenn wir die Leerzeichen nicht zählen müssten, aber ich gehe davon aus, dass das deine Einschränkung ist, also rolle ich damit. (Edit: ein dickes Lob an JohnG, dass es bessere Möglichkeiten, um dies zu realisieren als i Wechsel)

Das Problem ist, dass die userSentence.indexOf(" ") Funktion wird die ersten gefunden Lage von " " immer wieder zurückkehren, und da Sie halten Inkrementieren i aber don Nehmen Sie keine Änderungen an userSentence, der substring(i, userSentence.indexOf(" ")) Befehl macht keinen Sinn mehr.

Die Lösung zu dem oben genannten wäre, eine remainder Zeichenkette zu erklären, die den Teil von userSentence behält, der bleibt, nachdem das folgende testWord gefunden wird.

Ein weiterer Nachteil ist, dass indexOf() -1 zurückgibt, wenn kein Vorkommen von " " gefunden wird, was in diesem Fall bedeutet, dass Sie auf Ihrem letzten Wort sind. In diesem Fall würde der testWord auf das Ende remainder gesetzt werden.

Hier ist, was ich habe. Wieder super-klobig, aber ich versuche nicht alles neu zu schreiben, was du hast:

System.out.print("Please enter a sentence: "); 
    String userSentence=IO.readString(); 

    String testWord=""; 
    int countSpaces=0; 

    for(int j=0; j<userSentence.length(); j++){ 
     if((userSentence.charAt(j))==' '){ 
      countSpaces++; 
     } 
    } 

    for(int i=0; i<userSentence.length(); i++){ 
     while(i<userSentence.length() && userSentence.charAt(i)==' '){ 
      i++; 
      countSpaces--; 
     }  
     if(i<userSentence.length()){ 
      String remainder = userSentence.substring(i); 

      if(countSpaces==0){ 
      testWord=userSentence.substring(i); 
      i=userSentence.length(); 
      } else { 
      remainder = userSentence.substring(i); 
      int endOfWordIndex = remainder.indexOf(" ");  // set end of word to first occurrence of " " 
      if(endOfWordIndex == -1){       // if no " " found, 
      endOfWordIndex = remainder.length();   //  set end of word to end of sentence. 
      } 

      testWord=remainder.substring(0, endOfWordIndex);    
      i=i+(testWord.length()-1); 
     } 

    System.out.println("word: '" + testWord + "'"); 
Verwandte Themen