Начиная с последнего символа и повторяя назад на 3 - PullRequest
0 голосов
/ 28 февраля 2019

Я пытаюсь создать код, который принимает любую строку и возвращает ее мне обратно, пропуская каждый третий символ и включая самый последний символ.

Пример: «123456789» должно возвращать «963» и «Привет, мир!»должен вернуть "! r lH"

import java.util.Scanner;

public class cypher {
   public static void main(String[] args) {
      Scanner scnr = new Scanner(System.in);
      String str = scnr.nextLine(); 
      String reverse = "";
      System.out.println(str.length());
      for (int i = str.length() - 1; i >= 0; --i) {
        reverse = reverse + str.charAt(i - 3);
      }
      System.out.println(reverse);
   }
}

Код выше - это то, что я имею до сих пор.Однако, когда я запускаю этот код, я получаю это сообщение об ошибке: «Исключение в потоке» main »java.lang.StringIndexOutOfBoundsException: Строковый индекс выходит за пределы диапазона: -1»

Я не понимаю, потому что длина строки10 так почему же он не может этого сделать?Может ли кто-нибудь объяснить мне это и дать мне предложение, как это исправить?

Ответы [ 5 ]

0 голосов
/ 28 февраля 2019

Немного изменил ваш код, и теперь он работает нормально.

Вы получили java.lang.StringIndexOutOfBoundsException, потому что ваш цикл for уменьшался на один шаг каждый раз вместо требуемого шага 3. В результате, когда строка содержит менее 3 символов, оставалось значение переменной i становится отрицательным, и возникает исключение, когда вызывается функция charAt(i) с отрицательным значением.

import java.util.Scanner;

public class cypher {
   public static void main(String[] args) {
      Scanner scnr = new Scanner(System.in);
      String str = scnr.nextLine(); 
      String reverse = "";
      System.out.println(str.length());
      int i = str.length() - 1;
      while(i >= 0)
      {
        reverse = reverse + str.charAt(i);
        i-=3;
      }
      System.out.println(reverse);
   }
}
0 голосов
/ 28 февраля 2019

Я попробовал этот код в моей системе, и он отлично работает.Попробуйте это:

import java.util.Scanner;

public class cypher {


public static void main(String[] args) {
  Scanner scnr = new Scanner(System.in);
  String str = scnr.nextLine(); 
  String reverse = "";
  System.out.println(str.length());
  for (int i = str.length() - 1; i>= 0; i-=3) {
    reverse = reverse + str.charAt(i);
  }
  System.out.println(reverse);


}}
0 голосов
/ 28 февраля 2019

Я предлагаю просто итерировать символы в строке, начиная с последней позиции, и двигаться назад с шагом 3:

Scanner scnr = new Scanner(System.in);
String str = scnr.nextLine();
String reverse = "";

for (int i=str.length()-1; i >= 0; i=i-3) {
    reverse += str.charAt(i);
}

System.out.println(reverse);

Ваш текущий подход терпит неудачу, потому что цикл просто принимает один, а не тройнойшаги.Также обратите внимание, что вы можете использовать StringBuilder вместо String для построения строки reverse.Это может быть более эффективным (хотя сама JVM может заменить StringBuilder самостоятельно).

0 голосов
/ 28 февраля 2019

Ваша текущая логика str.charAt(i - 3) и продолжайте пока i >= 0.Оператор str.charAt(i - 3) будет генерировать java.lang.StringIndexOutOfBoundsException, когда i меньше 3, поэтому вы должны изменить свой код на этот.

public static void main(String args[]) {
    Scanner scnr = new Scanner(System.in);
    String str = scnr.nextLine();
    String reverse = "";
    System.out.println(str.length());
    for (int i = str.length() - 1; i >= 0; i = i - 3) {
        reverse = reverse + str.charAt(i);
    }
    System.out.println(reverse);
}
0 голосов
/ 28 февраля 2019

В соответствии с вашей текущей логикой str.charAt(i - 3) здесь, когда значение i становится меньше 3, ваш код будет пытаться получить доступ и индексировать это -ve число и, таким образом, выдает это исключение.

ВыВам придется проверить, если i - 3 >= 0, прежде чем использовать str.charAt(i - 3) иначе вырваться из цикла.

...