[java] Java에서 int 배열을 어떻게 되돌 립니까?

Java에서 int 배열을 되돌리려 고합니다.

이 방법은 배열을 바꾸지 않습니다.

for(int i = 0; i < validData.length; i++)
{
    int temp = validData[i];
    validData[i] = validData[validData.length - i - 1];
    validData[validData.length - i - 1] = temp;
}

무엇이 잘못 되었나요?



답변

int 배열을 반대로하려면 다음과 같이 중간 점에 도달 할 때까지 항목을 교체하십시오.

for(int i = 0; i < validData.length / 2; i++)
{
    int temp = validData[i];
    validData[i] = validData[validData.length - i - 1];
    validData[validData.length - i - 1] = temp;
}

당신이 그것을하는 방식으로, 당신은 각 요소를 두 번 교환하므로 결과는 초기 목록과 동일합니다.


답변

Commons.Lang , 당신은 간단하게 사용할 수 있습니다

ArrayUtils.reverse(int[] array)

대부분의 경우 문제를 처리 할 때 이미 단위 테스트 및 사용자 테스트를 거친 쉽게 사용할 수있는 라이브러리를 사용하는 것이 더 빠르고 안전합니다.


답변

public class ArrayHandle {
    public static Object[] reverse(Object[] arr) {
        List<Object> list = Arrays.asList(arr);
        Collections.reverse(list);
        return list.toArray();
    }
}


답변

Collections.reverse(Arrays.asList(yourArray));

java.util.Collections.reverse()되돌릴 수 java.util.List들과 java.util.Arrays.asList(), 당신이 그것에 전달하는 특정 배열을 감싸는 목록을 반환 그러므로 yourArray의 호출 후 역전된다 Collections.reverse().

비용은 하나의 List 객체를 만드는 것이므로 추가 라이브러리가 필요하지 않습니다.

Tarik과 그 해설자들의 답변에서 비슷한 해결책이 제시되었지만이 답변이 더 간결하고 쉽게 파싱 될 수 있다고 생각합니다.


답변

루프의 각 반복에서 스왑하는 인덱스를 추적하기 위해 명시 적 변수를 선언하면 알고리즘의 논리를 따르는 것이 조금 더 쉽다고 생각합니다.

public static void reverse(int[] data) {
    for (int left = 0, right = data.length - 1; left < right; left++, right--) {
        // swap the values at the left and right indices
        int temp = data[left];
        data[left]  = data[right];
        data[right] = temp;
    }
}

또한 while 루프 에서이 작업을 수행하는 것이 더 읽기 쉽다고 생각합니다.

public static void reverse(int[] data) {
    int left = 0;
    int right = data.length - 1;

    while( left < right ) {
        // swap the values at the left and right indices
        int temp = data[left];
        data[left] = data[right];
        data[right] = temp;

        // move the left and right index pointers in toward the center
        left++;
        right--;
    }
}


답변

여기에 이미 많은 답변이 있습니다. 주로 배열을 수정하는 데 중점을 둡니다. 그러나 완전성을 기하기 위해 Java 스트림을 사용하여 원래 배열을 보존하고 새로운 역 배열을 만드는 또 다른 방법이 있습니다.

    int[] a = {8, 6, 7, 5, 3, 0, 9};
    int[] b = IntStream.rangeClosed(1, a.length).map(i -> a[a.length-i]).toArray();


답변

구아바와 함께 :

Collections.reverse(Ints.asList(array));