2017-10-14 3 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

그것은'index2 = 길이 있어야한다 - 1;'배열은 0에서 색인 기억 ... 길이 - 1 –

+0

이것을 사용해보십시오 : length = myString.length() - 1; –

+0

그건 그렇고, 내가 제안 할 수 있다면, 당신은 이것을하기 위해 두 개의 배열이 필요 없다. 두 개의 인덱스 변수가있는 단일 배열을 사용하고 첫 번째 문자와 마지막 문자를 바꾼 다음 두 번째 문자와 마지막 문자 등을 바꿔 넣으십시오. 두 색인이 중간에서 만날 때까지 계속 수행합니다. – Discoverer98

답변

1

배열의 마지막 인덱스 하지array.length하지만 array.length - 1이다. 배열은 0베이스에 색인되어 있으며 첫 번째 색인은 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++; 
}