从最后一个字符开始,向后迭代3

问题描述 投票:0回答:5

我正在尝试创建一个代码,该代码接收任何字符串并将其转发给我,向后丢失每个第3个字符并包括最后一个字符。

EX:“123456789”应该返回“963”和“Hello,World!”应该返回“!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所以为什么它不能这样做?有人可以向我解释这个并给我一个如何解决这个问题的建议吗?

java string reverse charat
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)。


0
投票

你当前的逻辑是str.charAt(i - 3)并继续i >= 0。当str.charAt(i - 3)小于3时,java.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);
}

0
投票

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

在使用i - 3 >= 0之前你必须检查str.charAt(i - 3)是否会突破循环。


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


}}

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);
   }
}
© www.soinside.com 2019 - 2024. All rights reserved.