从最后一个字符开始并向后迭代 3
Starting with the last character and iterating backwards by 3
我正在尝试创建一个代码,它接受任何字符串并将它向后传递给我,每 3 个字符都丢失,包括最后一个字符。
EX: "123456789" should return "963" &
"Hello, World!" should return "!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);
}
}
上面的代码是我目前所拥有的。但是,当我 运行 此代码时,我收到此错误消息: "Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: -1"
我不明白,因为字符串长度是 10,所以为什么不能这样做?有人可以向我解释一下这个问题并给我一个解决方法的建议吗?
根据您当前的逻辑 str.charAt(i - 3)
,当 i
的值小于 3 时,您的代码将尝试访问和索引一个 -ve 数字,从而抛出此异常。
在使用 str.charAt(i - 3)
之前你必须检查是否 i - 3 >= 0
否则跳出循环。
我建议只迭代字符串中的字符,从最后一个位置开始,以 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
)。
您当前的逻辑是 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);
}
我在我的系统中试过这段代码,它工作正常。试试这个:
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);
}}
稍微更改了您的代码,现在可以正常工作了。
你得到 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);
}
}
我正在尝试创建一个代码,它接受任何字符串并将它向后传递给我,每 3 个字符都丢失,包括最后一个字符。
EX: "123456789" should return "963" & "Hello, World!" should return "!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);
}
}
上面的代码是我目前所拥有的。但是,当我 运行 此代码时,我收到此错误消息: "Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: -1"
我不明白,因为字符串长度是 10,所以为什么不能这样做?有人可以向我解释一下这个问题并给我一个解决方法的建议吗?
根据您当前的逻辑 str.charAt(i - 3)
,当 i
的值小于 3 时,您的代码将尝试访问和索引一个 -ve 数字,从而抛出此异常。
在使用 str.charAt(i - 3)
之前你必须检查是否 i - 3 >= 0
否则跳出循环。
我建议只迭代字符串中的字符,从最后一个位置开始,以 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
)。
您当前的逻辑是 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);
}
我在我的系统中试过这段代码,它工作正常。试试这个:
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);
}}
稍微更改了您的代码,现在可以正常工作了。
你得到 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);
}
}