Array Sorting 배열 정렬

장찬익·2023년 10월 10일

JAVA 학습 일지

목록 보기
17/28
  • Arrays.sort()

Arrays.sort()을 이용하면 쉽게 String과 int타입의 배열을 정렬할 수 있다. 기본적으로 Arrays.sort()는 Comparable 구현에 의해 정렬된 것이다.
Comparable은 정렬 기준이 되는 메소드를 정의하는 인터페이스로 해당 인터페이스에서 compareTo() 메소드를 오버라이드하여 선언한다.
결국, Arrays.sort()를 실행시키면 Comparable 인터페이스에서 compareTo() 메소드를 기준으로 배열을 정렬하는 것이다.

Arrays.sort() 사용법 5가지

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

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

오름차순 정렬

Arrays.sort() 기본값이기 때문에 해당 인자로 배열을 전달하면 오름차순으로 자동 정렬을 해준다.

int[] arr = {1, 26, 19, 54, 43, 67};

Arrays.sort(arr);

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

//결과 Sorted arr[] : [1, 19, 26, 43, 54, 67]

내림차순 정렬

내림차순으로 정렬하려면 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));

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

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

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));
// 결과  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));

//결과 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));
//결과 Sorted arr[] : [Watermelon, Orange, Kiwi, Cherry, Banana, Apple]

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));
//결과 Sorted arr[] : [Kiwi, Apple, Orange, Banana, Cherry, Watermelon]

객체 배열 정렬(Sorting)

Custom 클래스의 객체를 갖고 있는 배열도 sort()로 정렬할 수 있습니다.
대신, Custom 클래스에 Comparable을 구현하여 sort()가 객체를 비교할 수 있도록 만들어야 합니다.
아래 예제에서는 Fruit라는 클래스를 정의하였습니다. 이 클래스는 Comparable를 구현하고 있습니다.

  • 이 클래스에서 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));
/*결과 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}]*/
profile
장찬익 입니다

0개의 댓글