본문 바로가기
Work/Java

[Java] int, String 배열 오름차순/내림차순 정렬

배열은 기본적으로 Arrays.Sort()를 이용해서 정렬한다.

1차원 배열은 Sort에 해당 배열을 인자로 넣어 기본적으로 오름차순 정렬을 하는데,

내림차순 정렬을 하기 위해서는 두번째 인자로 Collections.reverOrder()를 사용한다.

 

 

1. 1차원 배열의 정렬

배열을 정렬할때 우리는 java.util.Arrays 를 통해서 sort()를 이용한다.

sort를 통해, 배열의 모든 Object 타입을 정렬할 수 있다.

 

1) String 배열의 정렬 (오름차순, 내림차순)

    // 1차원 문자열 배열 정렬
    public static void StringArray1D () {
        String[] strArray = {"aa", "ac", "ab", "ad"};
        System.out.println("----String 배열 오름차순----");
        Arrays.sort(strArray);
        for (String i : strArray) {
            System.out.print(i + " ");
        }
        System.out.println("\n----String 배열 역순----");
        Arrays.sort(strArray, Comparator.reverseOrder()); // 내림차순
        for (String i : strArray) {
            System.out.print(i + " ");
        }
    }

Collections는 기본적으로 Object를 상속한 클래스에 대해서 사용 가능한 인터페이스이므로,

String, Integer, Double 등과 같은 Object 타입에 배열은 sort에 Collections.reverseOrder() 사용이 가능하고

기본타입인 int, double, char, float 등은 사용이 불가하므로

기본타입의 배열을 Object를 상속하는 Wrapper 클래스로 박싱해주어야 역순정렬도 가능하다.

아래 int 배열의 역순정렬 예제를 보자

 

2) Int 배열의 정렬 (오름차순, 내림차순)

// 1차원 int 배열 정렬
public static void intArray1D () {
    int[] intArray = {1,3,5,7,2,4,6};
    System.out.println("----int 배열 오름차순----");
    Arrays.sort(intArray);
    for (int i : intArray) {
        System.out.print(i + " ");
    }
    
    System.out.println("\n----int 배열 역순----");
    // primitive Type을 Wrapper클래스로 박싱해주어야 reverseOrder 사용가능.
    Integer[] tmp = Arrays.stream(intArray).boxed().toArray(Integer[]::new);
    Arrays.sort(tmp, Comparator.reverseOrder()); // 내림차순
    for (int i : intArray) {
        System.out.print(i + " ");
    }
}

 

 

 

2. N차원 배열의 정렬

객체배열이나, 2차원 배열부터는 sort 메소드를 안에 Comparator 를 구현하여 넘겨주므로 다양한 정렬이 가능하다.

// N차원  배열 정렬
public static void exComparator () {
    // 배열의 0번값을 기준으로 정렬 comparator
    Comparator<int[]> com1 = new Comparator<int[]>() {
        @Override
        public int compare(int[] o1, int[] o2) {
            return o1[0] -o2[0]; // 반대로 바꾸면 큰값부터 내림차순 정렬
        }
    };
    // 배열의 1번값을 정렬하는 Comparator
    Comparator<int[]> com2 = new Comparator<int[]>() {
        @Override
        public int compare(int[] o1, int[] o2) {
            return o1[1] - o2[1];
        }
    };
    // 2차원배열에 물품번호, 가격이 담겨있다고 가정
    int[][] arr = {{1,5000},{2,3000},{3,7000},{4,1000}};
    System.out.println("com1로 정렬---");
    Arrays.sort(arr, com1);
    for (int[] a : arr)
        System.out.println(a[0]+" "+a[1]);
    System.out.println("com2로 정렬---");
    Arrays.sort(arr, com2);
    for (int[] a : arr)
        System.out.println(a[0]+" "+a[1]);
}

Comparator는 위와 같이 미리 구현해두어 변수처럼 넣어서 재사용성을 가지게 할 수 있지만

여러번 정렬하지 않는 대부분에 경우에는 아래와 같이 sort 인자부분에서 구현과 동시에 사용후 소멸시킨다.

+ N차원 배열 문자열 비교정렬 예제

Arrays.sort(arr, new Comparator<int[]>() {
    @Override
    public int compare(int[] o1, int[] o2) {
        return o1[0] - o2[0]; // 배열의 0번 int값을 비교하여 오름차순 구현
    }
});
//Lambda식으로 축약하여 표현
Arrays.sort(arr, (o1, o2) -> o1[0] - o2[0]); // 위와 동일 문법임

 

문자열로 이루어진 배열은 연산자 (-) 를 사용하지 않고, compareTo를 사용한다.

String[][] exArray = {{"aa","100"}, {"ac","101"}, {"ab","102"},{"ad","103"}};
Arrays.sort(exArray, new Comparator<String[]>() {
    @Override
    public int compare(String[] o1, String[] o2) {
        return o1[0].compareTo(o2[0]);
    }
});
Arrays.sort(exArray, (o1, o2) -> o1[0].compareTo(o2[0])); // 축약식

compareTo 더 알아보기 ↓

더보기

Wrapper 클래스마다 존재하는 compareTo는 비교를 통해 음수, 0 ,양수 을 반환한다.

Integer a = 10;
System.out.println(a.compareTo(20)); // 출력값은 -1 임
String a = "aaa";
System.out.println(a.compareTo("ccc"));

String은 차이값만큼을 반환

 

 

3. 정리

  • 배열 정렬은 Arrays.sort() 를 이용한다.
  • 기본타입 정렬은 오름차순만 가능하다.
  • 1차원배열에 역순 정렬을 사용하기 위해서는 Collections.reverseOrder()를 사용한다.
  • Collections는 기본타입은 지원하지 않기 때문에, Wrapper로 박싱이 필요하다.
  • 2차원 배열부터는 Comparator (compare 메소드)를 구현 사용한다.
  • Comparator 사용시 Wrapper Class 비교정렬은 각 클래스마다 구현되어있는 compareTo 메소드를 이용한다.
  • 모든 Wrapper Class 에는 compareTo 메소드가 존재하므로, 잘 활용하자.

 

다음 글에서 객체배열을 정렬할 때 사용하는 Comparable을 정리해보겠다.