【问题标题】:Starting with the last character and iterating backwards by 3从最后一个字符开始并向后迭代 3
【发布时间】:2019-02-28 05:51:23
【问题描述】:

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

EX:“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 那么为什么它不能这样做呢?有人可以向我解释一下,并就如何解决这个问题给我一个建议吗?

【问题讨论】:

    标签: java string reverse charat


    【解决方案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)。

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

          【解决方案4】:

          我在我的系统中尝试了这段代码,它运行良好。试试这个:

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

          【讨论】:

            【解决方案5】:

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

            您得到了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);
               }
            }
            

            【讨论】:

              猜你喜欢
              • 2021-08-02
              • 1970-01-01
              • 1970-01-01
              • 2015-03-23
              • 1970-01-01
              • 2016-05-11
              • 1970-01-01
              • 2019-06-21
              • 1970-01-01
              相关资源
              最近更新 更多