2016-01-15 3 views
-2

У меня есть этот код, чтобы найти палиндром ниже; Мне нужно удалить все числа, пробелы и пунктуацию из строки ввода пользователя, поэтому я использовал replaceAll. Когда у меня только String input = str.toLowerCase(); и String newInput = input.replaceAll("[0-9]+", ""); в моем коде, проблем не было. Он удаляет номера и продолжается. Однако, когда я пытаюсь добавить пунктуацию или пробел, я получаю исключение StringIndexOutOfBoundsException.Что вызывает это исключение StringIndexOutofBounds?

Пример: Я ввод Anna.55

Линия под все replaceAll заявления, System.out.println(newestInput);, печатает anna но сразу же бросает ошибку при достижении времени цикла и заявляет, что проблема с индексом 6.

Из моего понимания (я все еще учусь Java, и я не знаком с replaceAll) удаление пространства с replaceAll("\\s", "") бы удалить пробелы, оставленные предыдущими replaceAll заявления и, следовательно, не было бы никакого индекса 6 (или даже 4). Как происходит ошибка при индексе 6, когда она больше не существует?

import java.util.Scanner; 

public class PalindromeTester { 
    public static void main (String[] args) { 
     String str; 
     String another = "y"; 
     int left; 
     int right; 
     Scanner scan = new Scanner (System.in); 
     while (another.equalsIgnoreCase("y")) { 
      System.out.println("Enter a potential palindrome:"); 
      str = scan.nextLine(); 
      left = 0; 
      right = str.length() - 1;   
      String input = str.toLowerCase(); 
      String newInput = input.replaceAll("[0-9]+", ""); 
      String newerInput = input.replaceAll("\\W", ""); 
      String newestInput = newerInput.replaceAll("\\s", "");   
      System.out.println(newestInput); 
      while (newestInput.charAt(left) == newestInput.charAt(right) && left < right) { 
       left++; 
       right--; 
      } 
      System.out.println(); 
      if (left < right) 
       System.out.println("That string is not a palindrome."); 
      else 
       System.out.println("That string is a palindrome."); 
      System.out.println(); 
      System.out.print ("Test another palindrome (y/n)? "); 
      another = scan.nextLine(); 
     } 
    } 
} 
+0

В первую очередь 'input.replaceAll (" \\ W "," ")' вы не должны использовать здесь 'newInput'? Во-вторых: думайте, что это хорошая идея, чтобы вычислить 'right', _before_ вы уменьшаете размер вашей строки String? – Tom

+0

'Как есть ошибка при индексе 6, когда она больше не существует?' Разве такой ответ не отвечает на ваш вопрос? Вам нужно включить соответствующие части трассировки стека, чтобы дать людям больше шансов помочь вам. – John3136

ответ

2

Вы используете right = str.length() - 1;, чтобы определить длину ввода, но изменить то, что было после ввода этого (и что вы сравните) ...

String input = str.toLowerCase(); 
String newInput = input.replaceAll("[0-9]+", ""); 
String newerInput = input.replaceAll("\\W", ""); 
String newestInput = newerInput.replaceAll("\\s", ""); 

System.out.println(newestInput); 
while (newestInput.charAt(left) == newestInput.charAt(right) && left < right) { 

Что означает String нет длиннее первоначальной длины, в вашем примере, это 1 характер короче

Вместо расчета длины newestInput вместо

right = newestInput.length() - 1; 
System.out.println(newestInput); 
while (newestInput.charAt(left) == newestInput.charAt(right) && left < right) { 
+0

* «это 1 символ короче» * .. Это интересная часть, она должна быть на 3 символа короче: D. Но решение этого довольно просто, так что это уже не интересно. – Tom

+1

input = 'Anna.55' output =' anna55'; тот факт, что OP использует 'repalceAll' в неправильном экземпляре' String', ну, учитывая характер вопроса, я решил, что получит 1 «получить отладочную бесплатную» карту;) – MadProgrammer

+0

Это был мой недосмотр, извините ,Я был убежден, что проблема связана с тем, как я использовал 'replaceAll' неправильно, что я не проверял порядок/размещение моих операторов. Спасибо! –

2

Две вещи сначала:

Я думаю

input.replaceAll("\\W", ""); 

должен быть

newInput.replaceAll("\\W", ""); 

И сразу следует рассчитывать после того, как маркеры будут удалены, а не до того, как так:

left = 0; 
String input = str.toLowerCase(); 
String newInput = input.replaceAll("[0-9]+", ""); 
String newerInput = newInput.replaceAll("\\W", ""); 
String newestInput = newerInput.replaceAll("\\s", ""); 
right = newestInput.length() - 1; 

В противном случае right может быть больше, чем длина newestInput, и вы получите java.lang.StringIndexOutOfBoundsException.

0

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