반응형

Python의 경우 sort()함수를 사용하여 손쉽게 리스트들을 정렬했었다. 요즘은 Python말고 Java로 알고리즘 문제들을 풀어보고 있는데 Java에도 sort()와 같은 함수로 쉽게 정렬을 해주는 메서드가 있지 않을까 검색을 해보니 Arrays.sort()를 찾을 수 있었다.

사용 예제 코드

int[][] arr = new int[3][2];

arr[0][0] = 1;
arr[0][1] = 10;
arr[1][0] = 5;
arr[1][1] = 5;
arr[2][0] = 3;
arr[2][1] = 1;

Arrays.sort(arr, new Comparator<int[]>() {
    @Override
    public int compare(int[] t1, int[] t2) {
      return t1[0] - t2[0];
    }
});

/**
 * 정렬 후 arr
 *         1 10
 *         3  1
 *         5  5
 */
  • 위의 코드는 arr이라는 2차원 배열의 [0]번 인덱스 값을 기준으로 오름차순 정렬을 하는 코드이다.
  • 내림차순을 하고 싶다면 return 값에서 t2[0] - t1[0]을 해주면 된다.

if 비교하는 인덱스의 값은 같고 다른 인덱스를 기준으로도 정렬을 해야한다면?

Arrays.sort()는 앞에 정렬을 하고자하는 Object가 오면 뒤에 인자에 정렬기준을 만들어주어야 한다. 위에서는 Comparator를 사용하여 compare를 오버라이딩하여 정렬기준을 만들어주었다. 그렇다면 이번 부제목에 해당하는 것도 이 정렬기준을 잘만 만들어준다면 가능하다.

/**
 * 정렬 전 arr
 *    4 10
 *         4  5
 *         5  7
 *         3  1
 *    5  5
 */

Arrays.sort(arr, new Comparator<int[]>() {
  @Override
  public int compare(int[] t1, int[] t2) {
    if (t1[0] == t2[0])
      return t1[1] - t2[1];            // 0번째 인덱스가 같다면 1번째 인덱스를 비교한 값을 return
    else
      return t1[0] - t2[0];
  }
});

/**
 * 정렬 전 arr
 *         3  1
 *         4  5
 *    4 10
 *    5  5
 *         5  7
 */
  • t1[0] == t2[0]일때 [1]의 인덱스 값들을 비교하여 return값을 주는 방법으로 앞의 값이 같을때는 뒤의 값으로 정렬을 할 수 있다.

  • 위와 같이 Comparator<T[]>를 사용하여 compare메서드를 오버라이딩 할 수도 있지만 아래와 같이 람다와 Integer에 정의되어있는 compare를 사용해서도 위와 같이 정렬을 할 수 있다.

    Arrays.sort(meeting, (t1,t2) -> {
      if (t1[1] == t2[1]) {
        return Integer.compare(t1[0], t2[0]);
      } else {
        return Integer.compare(t1[1], t2[1]);
      }
    });
반응형

BELATED ARTICLES

more

COMMENT