[Java] 정렬 API (Array, Collection, Comparator)

Java 정렬 API 학습하기

1. 학습 목표

  • Arrays.sort() 기본API
  • Collections.sort() 기본 API
  • Stream의 Sort를 사용(with Lambda)
    • comparing
    • thenComparing

2. Arrays.sort()

Java에서 알고리즘 문제를 풀거나 할때, 기본 배열이 주어지는 경우가 많아서 가끔씩 쓸 일이 있다.

int[] ints = {5, 4, 2, 1, 3};
// 1) 기본 정렬
Arrays.sort(ints); // [1,2,3,4,5]

// 2) 특정 인덱스 정렬
Arrays.sort(ints, 0, 3); // [2,4,5,1,3]

2)에서 fromIndex 에서 toIndex까지 지정할 수 있다. 위의 예제는 0번째 인덱스에서 2번째까지(3번째는 exclusive라 미 포함임) 값들을 정렬한다. 사실 특정 index범위만 정렬할 일이 있나? 별로 사용하지 않는것 같다.

3. Collections.sort()

Collections.sort()를 사용하려면 Collection을 파라미터로 넘겨야 한다.

// 1) 단순 String 정렬
List<String> list = Arrays.asList("betty", "andrew", "robert");
Collections.sort(list); // [andrew, betty, robert] 오름차순으로 나온다.


// 2) 위의 배열 예제
int[] ints = {5, 4, 2, 1, 3};
// 일단 Array를 Collection으로 변경해야 한다. 
List<Integer> intList = Arrays.stream(getInts()).boxed().collect(Collectors.toList());
Collections.sort(intList);

4. Stream의 sort를 Lamda식으로 사용해보자

List<String> list = Arrays.asList("betty", "andrew", "robert");

// 스트림의 중간메서드 sorted()에 Compartor를 파라미터로 넘긴다.
List<String> result = list.stream().sorted(String::compareTo).collect(Collectors.toList()); //[andrew, betty, robert]

4.1. Compartor 더 살펴보기

스크린샷 2021-07-13 오후 6 59 18 Compartor API

Comparator의 인터페이스에는 default method로 comparing()thenComparing()메서드들을 제공해준다.

위의 메서드를 사용하는 예제를 사용하는 경우를 살펴보자! 일단, 간단한 User POJO를 만들자

@Getter
@Setter
@ToString
public class User {
    private String name;
    private Integer age;
  // ...생성자
}

다음과 같이 dummy 데이터를 만들어 준다.

public static List<User> getUsers() {
  User user = new User("andrew", 32);
  User user1 = new User("betty", 24); 
  User user2 = new User("robert", 40);
  User user3 = new User("andy", 24);
  return Arrays.asList(user, user1, user2, user3);
}

4.1.1. Comparing ()

다음과 같이 User의 나이 오름차순 으로 정렬해보자.

List<User> users = getUsers();

List<User> result = users
  .stream()
  .sorted(Comparator.comparing(User::getAge))
  .collect(Collectors.toList());

// 나이순 오름차순으로 정렬됨
//[User(name=betty, age=24), User(name=andy, age=24), User(name=andrew, age=32), User(name=robert, age=40)]

4.1.2. thenComparing()

이번에는 thenComparing()은 앞에서 동일한 조건인 경우에 그 다음에는 뭘로 비교할래?를 묻는 함수다.

지금 dummy데이터에 나이가 24로 andybetty가 나이가 같다!

예상결과는 1) 나이 오름차순으로 비교, 그리고 (같은 나이라면) 그 다음은 2) 이름 오름차순으로 비교 한다.

List<User> result1 = users
  .stream()
  .sorted(Comparator.comparing(User::getAge).thenComparing(User::getName))
  .collect(Collectors.toList());

//나이, 이름순으로 정렬
//[User(name=andy, age=24), User(name=betty, age=24), User(name=andrew, age=32), User(name=robert, age=40)]