본문 바로가기

잡다한 개발잡담

Java - 배열, 리스트 내림차순으로 정렬하려면?

프로그래밍을 하다 보면 배열을 정렬해야 할 때가 반드시 존재합니다.

자바에서는 어떻게오름차순? 그리고 내림차순으로 정렬할 수 있을까요?

퀵 소트, 선택 정렬, 병합 정렬 등을 직접 구현해서 정렬하는 것도 좋은 방법이지만 자바에서 이미 구현해놓은 정렬 메서드를 사용하는 게 가장 편하고 정확한 방법입니다.

가장 대중적으로 많이 사용하는 정렬 방법은 Arrays.sort() 매서드를 사용하는 것입니다.

Integer 배열 정렬 소스코드

public class 정렬 {

    public static void main(String[] args) {
        Integer[] arr = {3,4,6,4,1,3,7,11,10};
        Arrays.sort(arr); // 1. 오름차순
        printArray(arr);
        Arrays.sort(arr, Collections.reverseOrder()); // 2.내림차순
        printArray(arr);

    }

    private static void printArray(Object[] arr){

        for(int i=0; i<arr.length; i++){
            System.out.print(" " + arr[i]);
        }
        System.out.println();

    }
}

그런데 만약 여기서 Integer[] arr -> int[] arr로 변경하게 되면 내림차순 정렬은 지원하지 않습니다.

Arrays.sort() 매서드는 원시형의 내림차순을 지원하지 않으므로 다른 방식으로 내림차순 정렬을 시도해야 합니다.

관련돼서 스택 오버 플로우를 검색해서 몇 가지 방법을 찾아서 아래에 공유하도록 하겠습니다.

1. 곱하기 -1을 활용한 내림차순 소스코드

public class 정렬 {

    public static void main(String[] args) {
        int[] arr = {3,4,6,4,1,3,7,11,10};
        Arrays.sort(arr); // 1. 오름차순
        printArray(arr);

        // 2. 내림차순
        multifly(arr); // 2-1 . -1을 곱한다.
        Arrays.sort(arr); // 2-2. 오름차순 정렬한다.
        multifly(arr); // 2-3. -1을 곱한다.
        printArray(arr);

    }

    private static void printArray(int[] arr){

        for(int i=0; i<arr.length; i++){
            System.out.print(" " + arr[i]);
        }
        System.out.println();
    }

    private static void multifly(int[] arr){
        for(int i=0; i<arr.length; i++){
            arr[i] = -1 * arr[i];
        }
    }
}

2. Integer 배열로 변환

public class 정렬 {

    public static void main(String[] args) {
        int[] arr = {3,4,6,4,1,3,7,11,10};
        
        // 내림차순
        Integer newArr[] = Arrays.stream(arr).boxed().toArray(Integer[]::new); // Integer 배열로 변환
        Arrays.sort(newArr, Collections.reverseOrder());
        printArray(newArr);

    }

    private static void printArray(Object[] arr){

        for(int i=0; i<arr.length; i++){
            System.out.print(" " + arr[i]);
        }
        System.out.println();
    }

    private static void multifly(int[] arr){
        for(int i=0; i<arr.length; i++){
            arr[i] = -1 * arr[i];
        }
    }
}

3. 내림차순 배열을 직접 만들기

public class 정렬 {

    public static void main(String[] args) {
        int[] arr = {3,4,6,4,1,3,7,11,10};

        // 내림차순
        arr = descArr(arr);
        printArray(arr);
    }

    private static void printArray(int[] arr){

        for(int i=0; i<arr.length; i++){
            System.out.print(" " + arr[i]);
        }
        System.out.println();
    }

    private static int[] descArr(int[] arr){
        int[] descArr = new int[arr.length];
        Arrays.sort(arr);
        for(int i=0; i<arr.length; i++){
            descArr[i] = arr[arr.length-i-1];
        }
        return descArr;
    }
}

 

크게 3가지 방법을 찾아보았는데 사실 1번과 3번은 비슷한 예제인 것 같습니다. 2번의 소스코드는 Int배열을 Integer 배열로 변환하므로 원시형 자료 -> Wraaper 클래스로 변환하는 boxing 비용이 만만치 않을 것이라 생각됩니다. 이러한 점을 다 유의하시고 사용하시기 바랍니다.

String 클래스의 배열 정렬 소스코드

public class 정렬 {

    public static void main(String[] args) {
        String[] arr = {"a","c","d","f","h","a","c"};
        Arrays.sort(arr); // 1. 오름차순
        printArray(arr);

        Arrays.sort(arr, Collections.reverseOrder()); // 2. 내림차순
        printArray(arr);

    }

    private static void printArray(String[] arr){

        for(int i=0; i<arr.length; i++){
            System.out.print(" " + arr[i]);
        }
        System.out.println();
    }

}

String 클래스는 원시형이 아니므로 Arrays.sort를 그대로 사용하면 된다!

ArrayListd의 배열 정렬 소스코드

public class 정렬 {

    public static void main(String[] args) {
        ArrayList arr = new ArrayList();

        for(int i=0; i<10; i++){
            arr.add(i);
        }

        Collections.sort(arr, Collections.reverseOrder());
        printArray(arr);

    }

    private static void printArray(ArrayList arr){

        for(int i=0; i<arr.size(); i++){
            System.out.print(" " + arr.get(i));
        }
        System.out.println();
    }

}

LinkedListd의 배열 정렬 소스코드

public class 정렬 {

    public static void main(String[] args) {
        LinkedList arr = new LinkedList();

        for(int i=0; i<10; i++){
            arr.add(i);
        }

        Collections.sort(arr, Collections.reverseOrder());
        printArray(arr);

    }

    private static void printArray(LinkedList arr){

        for(int i=0; i<arr.size(); i++){
            System.out.print(" " + arr.get(i));
        }
        System.out.println();
    }

}

두 리스트 모두 Arrays.sort -> Collections.sort를 메서드를 사용하면 됩니다!

ArrayList와 LinkedList의 차이점이 가끔가다 헷갈릴 때가 있는데 ArrayList는 배열의 특성을 가진 리스트이고 LinkedList는 진짜 연결 리스트의 특성을 가진 리스트로 생각하면 된다. 물론 ArrayLsit는 실제 Array 보다는 편의성을 갖추고 있으므로 조금 느리다는 것을 알고 있으면 좋을 것 같습니다!

혹시 잘못된 점이 있으면 댓글로 알려주시면 바로 수정하겠습니다~

감사합니다.

참고 : https://stackoverflow.com/questions/1694751/java-array-sort-descending

 

Java Array Sort descending?

Is there any EASY way to sort an array in descending order like how they have a sort in ascending order in the Arrays class? Or do I have to stop being lazy and do this myself :[

stackoverflow.com