java - 从最后一个字符开始并向后迭代 3
问题描述
我正在尝试创建一个代码,该代码采用任何字符串并将其向后传递给我,缺少每个第三个字符并包括最后一个字符。
例如:“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 那么为什么它不能这样做呢?有人可以向我解释一下,并就如何解决这个问题给我一个建议吗?
解决方案
我建议只迭代字符串中的字符,从最后一个位置开始,以 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
)。
推荐阅读
- c++ - 为用于 Objective-C 的 C++ Factory 类编写包装器
- mysql - 如何从存储过程发出 00000(成功)的 sqlstate 信号?
- c# - 为什么我要输入 i++;在 if 块之外?
- javascript - 将时间转换为关键帧动画百分比
- api - 如何在 GitHub 公共存储库中读取文件的内容
- linux - 给定一个从客户端到服务器的已建立 tcp 连接,是否在没有服务器显式调用接受的情况下解决了第二个连接?
- graphics - 光线投射优化
- ruby - 从包含的文件调用时,Ruby 字符串插值不起作用
- c# - IntegerUpDown 控件在 Textbox IsFocused 时更改背景
- python - 可重用可迭代的语法?