본문으로 바로가기

Arrays.sort()

java.util.Arrays 유틸리티 클래스를 사용하면 배열(Array)을 정렬, 복제하거나, List로 변환 하는 등의 작업을 쉽게 처리 할 수 있습니다.  해당 클래스의 sort() 메서드를 사용하면 쉽게 오름차순 정렬이 가능합니다. sort() 메서드는 클래스 메서드(Class method / Static method)로써 Arrays 클래스의 인스턴스 생성없이 바로 사용하시면 됩니다.

참고로 기본 정렬조건이 오름차순 인 이유는 Class 내에 기본적으로 구현되어있는 Comparable Interface의 compareTo 메서드를 기준으로 하기 때문입니다. Java에서 인스턴스를 서로 비교하는 클래스들은 모두 Comparable 인터페이스가 구현 되어 있습니다.
/*public static void sort(int[] a)*/

// Array 
int[] intArr = new int[] {1,3,5,2,4};                                //Primitive Type                          
double[] doubletArr = new double[] {1.1, 3.3, 5.5, 2.2, 4.4};        //Primitive Type
String[] stringArr = new String[] {"A","C","F","E","D"};             //Reference type(Wrapper Class)

//Sort
Arrays.sort(intArr);            
Arrays.sort(doubletArr);    
Arrays.sort(stringArr);

▼ ▼ ▼

intArr : 1 2 3 4 5
doubletArr : 1.1 2.2 3.3 4.4 5.5
stringArr : A B C D E


정렬 대상 범위를 지정하여 해당 index 에 포함되는 구간만 정렬하는 것도 가능합니다.

/* public static void sort(int[] a, int fromIndex, int toIndex)*/

int[] intArr = new int[] {1,3,5,2,4};
Arrays.sort(intArr,2,5);  // intArr[2]~intArr[4]의 값 (5,2,4) 만 정렬 (toIndex 이전 index까지)
▼ ▼ ▼

intArr : 1 3 2 5 4



Comparable / Comparator 

내림차순이 이나 원하는대로 정렬 조건을 달리 하려면 어떻게 해야할까요? 위에 언급했던 것 처럼 정렬할 Class내에 구현되어 있는 Comparable 인터페이스의 compareTo() 메서드를 원하는 조건으로 오버라이드하거나 익명인터페이스 java.util.Comparator를 구현한 Class내 compare() 메서드를  원하는 정렬조건으로 오버라이드하여 sort 메서드 호출시 구현한 Comparator 클래스를 명시해 주시면 됩니다.

이는 Arrays 클래스의뿐만아니라 다른 자료 구조나 Comparable Stream등 콜렉션(Collection)을 다루는 정렬 메서드에 대부분 적용 할 수 있습니다.

주의할 점은 byte, char, double, short, long, int, float같은  PrimitiveType의 배열에는 적용이 불가능하니 Integer같은 Wrapper "Class"를 이용하셔야 한다는 점입니다.
Integer[] integerArr = new Integer[] {1,3,5,2,4};                          
String[] stringArr = new String[] {"A","C","B","E","D"};       
     
Arrays.sort(integerArr,Comparator.reverseOrder());     //내림차순
Arrays.sort(stringArr,Collections.reverseOrder());    //내림차순
▼ ▼ ▼
integerArr : 5 4 3 2 1
stringArr : E D C B A
위 예제에서는FunctionalInterface Comparator, java.util.Collections 클래스의 reverseOrder() 메서드를 사용하여 이미 내림차순으로 구현되어 있는 Comparator를 반환 하였습니다. 만약 내가 원하는 조건으로 정렬조건을 적용하고 싶다면 아래와 같이 Comparator 인터페이스의 compare 메서드를 오버라이드한 Class를 재정의 하여 넘겨 주시면 됩니다.

위의 예제와 동일하게 내림차순으로 정렬하는 Comparator 인터페이스를 직접 구현해 보겠습니다.
//custom Comparator
class CustomComparator implements Comparator<String> {
    @Override
    public int compare(String o1, String o2) {
       return o2.compareTo(o1); //내림차순
    }
}

String[] stringArr = new String[] {"A","C","B","E","D"};   
Arrays.sort(stringArr,new CustomComparator());   
▼ ▼ ▼
stringArr : E D C B A
Comparator 구현 클래스 정의 없이 Comparator 인스턴스 생성과 동시에 compare() 메서드를 오버라이드 하는 것도 가능합니다.
Arrays.sort(stringArr,new Comparator<String>() {
       @Override
       public int compare(String o1, String o2) {
              return o2.compareTo(o1); //내림차순
       }
});   


| Stream API

Java8 이상을 사용하신다면 배열이나 컬렉션을 다루는 스트림(Stream) API를 이용해서 정렬할 수 있습니다. Stream을 이용하면 람다식(Lambda expression)으로 표현하여 좀더 간결하게 표현 할 수 있습니다.
다음 예제는 String내 각 알파벳을 배열로 변환하여 정렬하는 예제입니다.
String str = "ACBED";

String[] stringArr = str.split("");   // new String[] {"A","C","F","E","D"}  배열로 변환

String streamSortASC =  Stream.of(stringArr).sorted().collect(Collectors.joining());    //오름차순
String streamSortDESC =  Stream.of(stringArr).sorted(Comparator.reverseOrder()).collect(Collectors.joining()); // 내림차순
//Lambda
String streamSortASC_Lambda =  Stream.of(stringArr).sorted((o1,o2)->o1.compareTo(o2)).collect(Collectors.joining());  //오름차순
String streamSortDESC_Lambda =  Stream.of(stringArr).sorted((o1,o2)->o2.compareTo(o1)).collect(Collectors.joining()); // 내림차순

▼ ▼ ▼

streamSortASC: ABCDE
streamSortDESC : EDCBA
streamSortASC_Lambda: ABCDE
streamSortDESC_Lambda : EDCBA


연관자료