2014-01-30 8 views
2

Я пытаюсь нарезать строку в первый раз.Нарезка строки

С помощью этого кода, если я ввожу, например, «один два три», он работает нормально до последнего слова. Это последние несколько строк вывода:

текущее слово Чет

Предложение теперь е

Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 3 
    at java.lang.String.substring(String.java:1907) 
    at TestCurr.main(testCurrentWord.java:18) 

Кто-нибудь любая идея, почему он делает это до последнего слова?

class TestCurr 
{ 
    public static void main (String []args) 
    { 
     String s; 
     int i; 
     String currentWord; 
     int length; 
     int spacePos; 

     System.out.println("Enter a sentence "); 
     s = EasyIn.getString(); 
     spacePos = s.indexOf(" "); 
     length = s.length(); 

     for (i = length -1; i >= 0; i--) 
      { 
       currentWord = s.substring(0,spacePos); 
       s = s.substring(spacePos +1); 

       System.out.println("Current word is " + currentWord); 
       System.out.println("Sentence is now " + s); 
      } 
    } 
} 
+0

Рассмотрите, что вы делаете _inside_ цикл даже после смены 's'. –

+0

Я предполагаю, что это домашнее задание (или тому подобное), и вы пытаетесь научиться разбивать строку самостоятельно. Если нет, вы должны использовать [функцию 'String.split'] (http://docs.oracle.com/javase/6/docs/api/java/lang/String.html#split%28java.lang.String% 29). –

ответ

2

Ваша проблема в том, что вы получаете только индекс пространства один раз. Это заставляет программу вырезать строку каждые три символа, так как первое слово длится три буквы. Вам необходимо обновить spacePos после каждой итерации.

+0

У меня есть spacePos = s.индекс(" "); внутри цикла теперь, и он исправляет проблему, спасибо, но я все равно получаю исключение. – Pizzaman

+2

Вы должны убедиться, что он никогда не вызывает 's.substring (spacePos + 1)' if spacePos> = s.length-1. –

+0

Спасибо, я попробую – Pizzaman

4

Прежде всего, вы звоните

spacePos = s.indexOf(" "); 
length = s.length(); 

только один раз, но эти значения должны изменяться с каждой итерации цикла. Кроме того,

s.substring(spacePos +1); 

с

spacePos == s.length()-1 

означает, что вы передаете указатель за пределы конца строки в качестве индекса для startsubstring(). После исправления первой ошибки это будет вашим следующим исключением.

1

Я считаю, что ваша проблема заключается в использовании вашей переменной spacePos.

Вне цикла инициализации переменной следующим образом:

spacePos = s.indexOf(" "); 

Что в вашем примере строка «один-два-три», выходы 3.

Но внутри цикла, вы никогда не установлены переменная снова, в зависимости от того, что осталось, что вы не обработали.

Попробуйте пересчитать значение spacePos внутри цикла, и ваша проблема должна исчезнуть.

0

Как заявили другие, вы получаете только один индекс. Но мне любопытно, зачем изобретать колесо?

String s = "one two three"; 
String[] split = s.split(" "); 
for (String out : split) { 
    System.out.println("Word: " + out); 
} 
1

Ваш текущий подход слишком подвержен ошибкам. И у вас слишком много переменных.

Попробуйте это как идея.

class TestCurr { 

    public static void main(String[] args) { 
     String s = null; 

     System.out.println("Enter a sentence: "); 
     s = " one two three "; 
     System.out.println("|" + s + "|"); 

     int i = 0; 
     int j = 0; 

     while (true){ 
      while (i<s.length() && s.charAt(i)==' ') i++; 
      j = i; 
      if (i>=s.length()) break; 
      while (i<s.length() && s.charAt(i)!=' ') i++; 
      System.out.println("Current word is: [" + s.substring(j, i)+ "]"); 
      System.out.println("Sentence is now: [" + s.substring(i) + "]"); 
      if (i>=s.length()) break; 
     } 

    } 

} 
Смежные вопросы