2014-11-19 1 views
-2
int temp; 
for (int i = 0; i < numbers.length/2; i++) { 
    temp = numbers[i]; 
    numbers[i] = numbers[numbers.length - 1 - i]; 
    numbers[numbers.length - 1 - i] = temp; 

내 연구소의 코드이기 때문에 이해가되지 않습니다.자바 배열 -이 코드의 기능을 설명 할 누군가가 필요합니까?

먼저 int temp를 선언하지만 그 이유는 무엇입니까? temp int 배열을 선언하면 안됩니까?

두 번째 줄은 절반을 전환하면 실제로 모든 값을 통과 할 필요가 없기 때문에 색인과 you/2를 통과하는 루프입니다. 모두 전환했습니다.

나는 다음 두 줄을 전혀 이해하지 못합니다.

미리 감사드립니다.

+4

몇 가지 테스트 케이스를 작성하여 확인하십시오. –

+2

디버거에서 단계별로 수행하고 무엇을하는지보십시오. – clcto

+0

'temp' (배열의 요소를 교환하기 위해 사용됩니다)는'for' 루프의 첫 번째 줄에서 선언되어야하며 배열이 아니어야합니다. –

답변

0

(1) 배열에서 스왑되는 변수의 값을 저장하도록 int temp를 선언하므로 배열 요소 중 하나를 덮어 쓸 때 여전히 변수 값을가집니다. 이를 위해서는 전체 배열을 사용할 필요가 없습니다.

(2) 이해할 수없는 코드는 임시 값을 자리 표시 자로 사용하여 numbers [i]와 numbers [numbers.length - 1 - i]에서 배열 값을 서로 바꿉니다.

1

조심스럽게 루프 내부 단계별 몇 번 :

[1,2,3,4,5] 

경우 :

temp = numbers[i]; 
numbers[i] = numbers[numbers.length - 1 - i]; 
numbers[numbers.length - 1 - i] = temp 

첫 패스가 그래서 이와 같은 배열로 시작 0

인 temp = numbers [0] then temp는 1이 될 것입니다. numbers.length는 5가 될 것이므로 numbers.length-1-i는 4가 될 것입니다. numbers [4]는 5입니다. 각 행을 마친 후에 i = 1 그러면 i = 2입니다. 완료되면 어레이를 검사하십시오 (변경 될 것입니다).

계속 그렇게하십시오. 수작업으로 대답하는 것보다 스스로 해결하는 것이 더 낫습니다. 훨씬 더 재미 있습니다.

0

이 코드는 모두 역 배열입니다. 그것은 array.length/2 (길이가 다른 경우 현명하다. 스왑하고, 아무것도하지 않고 다시 스왑한다).

임시 변수는 스왑이 진행되는 동안 이전 값을 유지하기위한 변수이기 때문에 배열 일 필요는 없습니다.

마지막 두 줄의 코드는 실제로 스왑이 발생하는 곳입니다.

그래서 {1, 2, 3, 4, 5}의 입력을 제공하면 {5, 4, 3, 2, 1}이 출력됩니다. 당신은 내가 = 0 때 보면

:

번호 [0] = 1, 숫자 [4] = 5,

온도가 1이 될 것이다, 그 다음 번호는 [0] 다음, 5가 될 것이다 numbers [4]는 temp (1)의 값이됩니다.

그래서 루프의 첫 번째 반복 한 후, 당신의 배열은 다음과 같이 표시됩니다

는 {5, 2, 3, 4, 1}

0

는 선언에 대해 너무 많이 걱정하지 마십시오. 당신이 전혀 이해하지 못하는 라인에 집중하겠습니다.이것은 온도로 배열의 i 번째 요소의 값을두고

temp = numbers[i]; 

(우리가 나중에 얻을 수있다)는 다음과 같이 루프 내부의 세 라인이다.

numbers[i] = numbers[numbers.length - 1 - i]; 

이렇게하면 끝에있는 i 번째 요소의 값을 i 번째 요소에 넣습니다.

numbers[numbers.length - 1 - i] = temp; 

이것은 i 번째 요소의 원래 값을 끝에있는 i 번째 요소에 넣습니다.

즉, 배열의 전반부를 반복하면서 배열의 두 번째 반쪽과 반대 요소로 요소를 교체합니다. 즉, 배열을 뒤집습니다.

관련 문제