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

Arrays.sort()을 이용하여 배열(Array)을 정렬(sorting)할 수 있습니다.

배열에 저장된 객체의 타입(Integer, String 등)과 관련 없이, Comparable이 구현된 객체라면 모두 정렬할 수 있습니다.

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

만약 Comparable이 구현되지 않은 클래스라면, Comparable을 구현하고 정렬 가능하도록 만들 수 있습니다.

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

Arrays.sort()로 int 배열을 인자로 전달하면 오름차순으로 정렬됩니다.

  • sort() 함수 내부에서 변수 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()를 전달해야 합니다.

  • Collections.reverseOrder()Comparator 객체이며, 역순으로 정렬해줌
  • Comparator는 직접 구현할 수 있지만, 미리 정의된 Collections 함수를 사용할 수 있음
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]

Comparable에 대해서 자세히 알고 싶으시다면 "Comparable로 정렬(Sorting)하는 방법, Comparator와의 차이점"를 참고해주세요.

내림차순 Comparator 직접 구현

내림차순 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를 사용해야 합니다.

2. int 배열, 부분 정렬

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

다음과 같이 sort()의 인자로 정렬 범위에 대한 처음 index와 마지막 index를 전달합니다.

아래 예제에서 sort()의 인자로 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]

3. 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)을 비교하는 방법 (==, equals, compare)을 참고해주세요.

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

만약 문자열 길이로 정렬을 하고 싶을 때는 직접 Comparator를 구현해야 합니다. 기본적으로 구현된 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));

5. 객체 배열 정렬(Sorting)

Custom 클래스의 객체를 갖고 있는 배열도 sort()로 정렬할 수 있습니다.

대신, Custom 클래스에 Comparable을 구현하여 sort()가 객체를 비교할 수 있도록 만들어야 합니다.

아래 예제에서는 Fruit라는 클래스를 정의하였습니다. 이 클래스는 Comparable<Fruit>를 구현하고 있습니다.

  • 이 클래스에서 compareTo() 함수는 자기 자신의 클래스와 인자로 전달되는 Fruit 객체의 price를 비교합니다.
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;
    }
}

아래와 같이 Fruit 배열을 sort()로 정렬할 수 있습니다.

  • 결과를 보면 오름차순으로 정렬된 것을 볼 수 있음
  • 클래스에 Comparable이 구현되었기 때문에 sort()는 이 객체를 다른 객체와 비교할 수 있음
  • 구현된 Comparable은 오름차순으로 정렬되도록 compareTo() 함수를 구현하였음
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}]

6. 참고

Loading script...

Related Posts

codechachaCopyright ©2019 codechacha