0

我正在尝试创建一个代码,该代码采用任何字符串并将其向后传递给我,缺少每个第三个字符并包括最后一个字符。

例如:“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);
   }
}

上面的代码是我目前所拥有的。但是,当我运行此代码时,我收到此错误消息:“线程“主”java.lang.StringIndexOutOfBoundsException 中的异常:字符串索引超出范围:-1”

我不明白,因为字符串长度是 10 那么为什么它不能这样做呢?有人可以向我解释一下,并就如何解决这个问题给我一个建议吗?

4

5 回答 5

1

我建议只迭代字符串中的字符,从最后一个位置开始,以 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)。

于 2019-02-28T05:57:44.137 回答
0

根据您当前的逻辑str.charAt(i - 3),当值i小于 3 时,您的代码将尝试访问和索引 -ve 数字,从而引发此异常。

i - 3 >= 0在使用str.charAt(i - 3)else 跳出循环之前,您必须检查是否。

于 2019-02-28T05:56:40.843 回答
0

您当前的逻辑是str.charAt(i - 3)并继续 while i >= 0。该str.charAt(i - 3)语句将在小于 3java.lang.StringIndexOutOfBoundsException时生成,因此您应该将代码更改为此。i

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);
}
于 2019-02-28T05:58:49.370 回答
0

我在我的系统中尝试了这段代码,它工作正常。试试这个:

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);


}}
于 2019-02-28T06:06:37.977 回答
0

稍微更改了您的代码,现在可以正常工作。

您得到了,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);
   }
}
于 2019-02-28T08:29:08.843 回答