더북(TheBook)

자바 8부터 Comparator 인터페이스에 유용한 메서드가 상당수 포함됐다. 이 중 하나가 comparingInt()다. 이 메서드는 제네릭 타입으로부터 int 정렬 키를 추출하는 함수를 입력으로 받아 그 정렬 키로 비교하는 Comparator<T>를 반환한다. 현재 Comparator 값을 뒤집는 reversed() 메서드도 상당히 유용하다.

두 메서드를 사용하면 다음과 같이 Arrays.sort()에 정렬을 맡길 수 있다.

public static void sortArrayByLength(String[] strs, Sort direction) {
  if (direction.equals(Sort.ASC)) {
    Arrays.sort(strs, Comparator.comparingInt(String::length));
  } else {
    Arrays.sort(strs,
      Comparator.comparingInt(String::length).reversed());
  } 
}

Info ≣ 비교자를 서로 이으려면(메서드 체인) thenComparing() 메서드를 사용한다.

앞선 해법들은 받은 배열 그대로 정렬하므로 void를 반환한다. 새로운 배열을 정렬해서 반환하고 주어진 배열을 변경하지 않으려면 다음 코드처럼 자바 8 함수형 스타일을 사용한다.

public static String[] sortArrayByLength(String[] strs, Sort direction) {
  if (direction.equals(Sort.ASC)) {
    return Arrays.stream(strs)
      .sorted(Comparator.comparingInt(String::length))
      .toArray(String[]::new);
  } else {
    return Arrays.stream(strs)
      .sorted(Comparator.comparingInt(String::length).reversed())
      .toArray(String[]::new);
  } 
}

위 코드는 주어진 배열로부터 스트림을 생성해 sorted() 스테이트풀 중간 연산으로 정렬한 후 그 결과를 또 다른 배열 안에 모은다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.