在没有 StringBuilder 的情况下反转 Java 中的字符串
Reverse a string in Java without StringBuilder
我试图在不使用 StringBuilder
的情况下反转字符串。我已经编写了下面的代码,但是一旦进入循环就会出错。错误是
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 16
at lectures.ReverseString.main(ReverseString.java:38)
如果有人能告诉我为什么那会很棒。仅供参考,我意识到这段代码既不高效也不优雅,但我想知道为什么它不适用于教育。
public static void main(String[] args) {
//declare variables
Scanner input = new Scanner(System.in);
String myString = "";
int length = 0, index = 0, index2 = 0;
//get input string
System.out.print("Enter the string you want to reverse: ");
myString = input.nextLine();
//find length of string
length = myString.length();
index2 = length;
//convert to array
char[] stringChars = myString.toCharArray();
char[] stringChars2 = stringChars;
//loop through and reverse order
while (index<length) {
stringChars2[index] = stringChars[index2];
index++;
index2--;
}
//convert back to string
String newString = new String(stringChars2);
//output result
System.out.println(newString);
//close resources
input.close();
}
数组中的最后一个索引是 而不是 array.length
,而是 array.length - 1
。数组在 零基础 上建立索引,第一个索引是 0
.
例如,具有 两个元素 的数组具有索引 [0]
和 [1]
,而不是 [2]
。
您在第一次迭代中访问 stringChars[index2]
和 index2 = length
,其中 length = myString.length()
。因此 IndexOutOfBoundException
。仔细阅读您的代码并分析您需要哪些索引。创建一个小示例,使用一些小打印语句来调试您的代码并查看您实际使用了哪些索引。
这是一个更紧凑的逆向算法的示例:
char[] input = ...
// Iterate in place, from both sides at one time
int fromFront = 0;
int fromEnd = input.length - 1;
while (fromFront < fromEnd) {
// Swap elements
char temp = input[fromEnd];
input[fromEnd] = input[fromFront];
input[fromFront] = temp;
fromFront++;
fromEnd--;
}
算法 交换 来自 first 位置的元素与来自 last 的元素位置到位。然后它向前移动一个 swapping second 元素与 second to last 等等。它 停止 一旦两个索引 相遇 (如果 length
是奇数)或者如果第一个索引变得比另一个更大(如果length
是偶数)。
一个更简单的版本,但是没有就地,是创建一个新数组:
char[] input = ...
char[] reversedInput = new char[input.length];
// Reversely iterate through source
int forwardIndex = 0;
for (int i = input.length - 1; i > 0; i--) {
reversedInput[forwardIndex] = input[i];
forwardIndex++;
}
我试图在不使用 StringBuilder
的情况下反转字符串。我已经编写了下面的代码,但是一旦进入循环就会出错。错误是
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 16
at lectures.ReverseString.main(ReverseString.java:38)
如果有人能告诉我为什么那会很棒。仅供参考,我意识到这段代码既不高效也不优雅,但我想知道为什么它不适用于教育。
public static void main(String[] args) {
//declare variables
Scanner input = new Scanner(System.in);
String myString = "";
int length = 0, index = 0, index2 = 0;
//get input string
System.out.print("Enter the string you want to reverse: ");
myString = input.nextLine();
//find length of string
length = myString.length();
index2 = length;
//convert to array
char[] stringChars = myString.toCharArray();
char[] stringChars2 = stringChars;
//loop through and reverse order
while (index<length) {
stringChars2[index] = stringChars[index2];
index++;
index2--;
}
//convert back to string
String newString = new String(stringChars2);
//output result
System.out.println(newString);
//close resources
input.close();
}
数组中的最后一个索引是 而不是 array.length
,而是 array.length - 1
。数组在 零基础 上建立索引,第一个索引是 0
.
例如,具有 两个元素 的数组具有索引 [0]
和 [1]
,而不是 [2]
。
您在第一次迭代中访问 stringChars[index2]
和 index2 = length
,其中 length = myString.length()
。因此 IndexOutOfBoundException
。仔细阅读您的代码并分析您需要哪些索引。创建一个小示例,使用一些小打印语句来调试您的代码并查看您实际使用了哪些索引。
这是一个更紧凑的逆向算法的示例:
char[] input = ...
// Iterate in place, from both sides at one time
int fromFront = 0;
int fromEnd = input.length - 1;
while (fromFront < fromEnd) {
// Swap elements
char temp = input[fromEnd];
input[fromEnd] = input[fromFront];
input[fromFront] = temp;
fromFront++;
fromEnd--;
}
算法 交换 来自 first 位置的元素与来自 last 的元素位置到位。然后它向前移动一个 swapping second 元素与 second to last 等等。它 停止 一旦两个索引 相遇 (如果 length
是奇数)或者如果第一个索引变得比另一个更大(如果length
是偶数)。
一个更简单的版本,但是没有就地,是创建一个新数组:
char[] input = ...
char[] reversedInput = new char[input.length];
// Reversely iterate through source
int forwardIndex = 0;
for (int i = input.length - 1; i > 0; i--) {
reversedInput[forwardIndex] = input[i];
forwardIndex++;
}