Java - 배열 정렬(Sorting) (오름차순, 내림차순)

JS · 07 Jun 2020

Arrays.sort()을 이용하면 쉽게 배열(Array)을 정렬(sorting)할 수 있습니다. 배열에 든 내용이 Integer인지 String인지는 중요하지 않습니다.

기본적으로 객체는 Comparable이 구현되어있습니다. sort()는 Comparable에 의해 리턴되는 값을 비교하여 오름차순 또는 내림차순으로 배열을 정렬합니다.

다음 내용들을 구현해보면서 Arrays.sort() 사용법에 대해서 알아보겠습니다.

  • int 배열 정렬 int 배열 정렬 (오름차순, 내림차순)
  • int 배열, 부분 정렬
  • String 배열 정렬
  • String 배열, 문자 길이 순서로 정렬
  • 객체 배열 정렬

int 배열 정렬 (오름차순, 내림차순)

아래와 같이 int 배열이 있습니다. Arrays.sort()의 인자로 이 배열을 전달하면 오름차순으로 정렬해줍니다. sort() 함수 내부에서 변수 arr의 순서를 변경해주기 때문에 따로 arr에 할당해줄 필요가 없습니다.

int[] arr = {1, 26, 17, 25, 99, 44, 303};

Arrays.sort(arr);

System.out.println("Sorted arr[] : " + Arrays.toString(arr));

Output:

Sorted arr[] : [1, 17, 25, 26, 44, 99, 303]

내림차순 정렬

내림차순으로 정렬하려면 sort()의 인자에 추가로 Collections.reverseOrder()를 전달해야 합니다.

Integer[] arr = {1, 26, 17, 25, 99, 44, 303};

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

System.out.println("Sorted arr[] : " + Arrays.toString(arr));

Output:

Sorted arr[] : [303, 99, 44, 26, 25, 17, 1]

사실 Collections.reverseOrder()Comparator 객체입니다. Comparator는 직접 구현해야하지만, 내림차순은 자주 사용되기 때문에 Collections에서 기본으로 제공해주고 있습니다.

내림차순 Comparator를 직접 구현하려면 다음과 같이 할 수 있습니다.

Integer[] arr = {1, 26, 17, 25, 99, 44, 303};

Arrays.sort(arr, new Comparator<Integer>() {
    @Override
    public int compare(Integer i1, Integer i2) {
        return i2 - i1;
    }
});

System.out.println("Sorted arr[] : " + Arrays.toString(arr));

위 코드는 Lambda를 사용하여 이렇게 더 짧게 구현할 수 있습니다.

Integer[] arr = {1, 26, 17, 25, 99, 44, 303};

Arrays.sort(arr, (i1, i2) -> i2 - i1);

System.out.println("Sorted arr[] : " + Arrays.toString(arr));

Comparator로 비교할 때는 int를 사용하지 않고 Integer를 사용해야 합니다.

int 배열, 부분 정렬

위의 예제는 배열(Array) 전체를 정렬하였습니다. 하지만, 배열의 일부분만 정렬할 수도 있습니다.

다음과 같이 sort()의 인자로 처음 index와 마지막 index를 전달하여 정렬할 범위를 지정해줘야 합니다. 아래 코드는 0과 4를 인자로 전달했는데, index 0에서 index 4를 포함하는 배열만 정렬하라는 의미입니다.

int[] arr = {1, 26, 17, 25, 99, 44, 303};

Arrays.sort(arr, 0, 4);

System.out.println("Sorted arr[] : " + Arrays.toString(arr));

Output:

Sorted arr[] : [1, 17, 25, 26, 99, 44, 303]

String 배열 정렬(Sorting)

String 배열도 Integer와 동일합니다.

아래처럼 구현하면, 알파벳의 아스키 값으로 비교를 하여 정렬을 합니다.

String[] arr = {"Apple", "Kiwi", "Orange", "Banana", "Watermelon", "Cherry"};

Arrays.sort(arr);

System.out.println("Sorted arr[] : " + Arrays.toString(arr));

Output:

Sorted arr[] : [Apple, Banana, Cherry, Kiwi, Orange, Watermelon]

내림차순으로 정렬하는 것도 위의 예제와 동일합니다.

String[] arr = {"Apple", "Kiwi", "Orange", "Banana", "Watermelon", "Cherry"};

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

System.out.println("Sorted arr[] : " + Arrays.toString(arr));

Output:

Sorted arr[] : [Watermelon, Orange, Kiwi, Cherry, Banana, Apple]

String 배열, 문자열 길이 순서로 정렬(Sorting)

만약 문자열 길이 순서로 정렬을 하고 싶을 때가 있습니다. 이럴 때는 직접 Comparator를 구현해야 합니다.

다음과 같이 문자열 길이를 비교하는 Comparator를 구현할 수 있습니다.

String[] arr = {"Apple", "Kiwi", "Orange", "Banana", "Watermelon", "Cherry"};

Arrays.sort(arr, new Comparator<String>() {
    @Override
    public int compare(String s1, String s2) {
        return s1.length() - s2.length();
    }
});

System.out.println("Sorted arr[] : " + Arrays.toString(arr));

Ouput:

Sorted arr[] : [Kiwi, Apple, Orange, Banana, Cherry, Watermelon]

Lambda를 사용하여 아래처럼 더 간결하게 구현할 수도 있습니다.

String[] arr = {"Apple", "Kiwi", "Orange", "Banana", "Watermelon", "Cherry"};

Arrays.sort(arr, (s1, s2) -> s1.length() - s2.length());

System.out.println("Sorted arr[] : " + Arrays.toString(arr));

객체 배열 정렬(Sorting)

객체를 갖고 있는 배열도 정렬할 수 있습니다. 이 경우에는 클래스에 Comparable을 구현하여 비교할 수 있게 해야 합니다.

다음과 같이 Fruit라는 클래스를 만들었습니다. 이 클래스는 Comparable<Fruit>를 구현하고 있습니다.

public static class Fruit implements Comparable<Fruit> {
    private String name;
    private int price;
    public Fruit(String name, int price) {
        this.name = name;
        this.price = price;
    }

    @Override
    public String toString() {
        return "{name: " + name + ", price: " + price + "}";
    }

    @Override
    public int compareTo(@NotNull Fruit fruit) {
        return this.price - fruit.price;
    }
}

위의 클래스에서 Comparable은 자기 자신의 클래스와 인자로 전달되는 Fruit의 price를 비교합니다.

이제 다음과 같이 Fruit 배열을 sort()로 정렬할 수 있습니다.

Fruit[] arr = {
        new Fruit("Apple", 100),
        new Fruit("Kiwi", 500),
        new Fruit("Orange", 200),
        new Fruit("Banana", 50),
        new Fruit("Watermelon", 880),
        new Fruit("Cherry", 10)
};

Arrays.sort(arr);

System.out.println("Sorted arr[] : " + Arrays.toString(arr));

Output:

Sorted arr[] : [{name: Cherry, price: 10}, {name: Banana, price: 50}, {name: Apple, price: 100}, {name: Orange, price: 200}, {name: Kiwi, price: 500}, {name: Watermelon, price: 880}]

결과를 보면 오름차순으로 정렬된 것을 볼 수 있습니다.

클래스 내부에 Comparable이 구현되었기 때문에 sort()는 이 객체를 다른 객체와 비교할 수 있었습니다. 그리고 Comparable은 오름차순으로 비교하도록 구현하였기 때문에 Fruit 객체들이 오름차순으로 정렬될 수 있었습니다.

참고

댓글을 보거나 쓰려면 이 버튼을 눌러주세요.
codechachaCopyright ©2019 codechacha