2017-10-14 48 views
0

我想通过StringBuilder反转字符串。我已经写了下面的代码,但是一旦碰到循环就会报错。该错误是在没有StringBuilder的Java中反转字符串

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

} 
+1

应当'索引2 =长度 - 1;'记住阵列索引从0 ...长度 - 1 –

+0

尝试使用此:长度= myString.length() - 1; –

+0

顺便说一句,如果我可以给一个建议,你不需要两个数组来做到这一点。只需使用一个单一的阵列中,有两个指标变量,并交换第一个和最后一个字符,然后交换第二个和最后一个字符的下一个,等等......你继续这样做,直到你的两个指标在中间相遇。 – Discoverer98

回答

1

在一个阵列中的最后一个索引是array.lengtharray.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--; 
} 

该算法互换从与来自最后位置元素中的第一位置的元素地点。然后将移至一个向前交换第二元素与倒数第二等。它停止一旦这两个指数满足对方(如果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++; 
}