[Java] 정렬 API (Array, Collection, Comparator)
Java의 기본 정렬과 Stream의 Sort레 Comparator를 람다식을 넘겨서 간편하게 사용하는 방법을 알아본다.
이 글에서 살펴볼 내용 · 5
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", "alice", "robert");
Collections.sort(list); // [alice, 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", "alice", "robert");
// 스트림의 중간메서드 sorted()에 Compartor를 파라미터로 넘긴다.
List<String> result = list.stream().sorted(String::compareTo).collect(Collectors.toList()); //[alice, betty, robert]4.1. Compartor 더 살펴보기
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("alice", 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=alice, age=32), User(name=robert, age=40)]4.1.2. thenComparing()
이번에는 thenComparing()은 앞에서 동일한 조건인 경우에 그 다음에는 뭘로 비교할래?를 묻는 함수다.
지금 dummy데이터에 나이가 24로 andy와 betty가 나이가 같다!
예상결과는 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=alice, age=32), User(name=robert, age=40)]광고 차단을 해제해 주세요
BRIEFLO는 광고 수익으로 기술 콘텐츠를 선별하고 요약합니다. 이 사이트의 광고를 허용해야 글을 계속 읽을 수 있어요.
- 광고 차단 확장 프로그램에서 이 사이트 허용을 선택해 주세요.
- 아래 버튼으로 페이지를 새로고침해 주세요.
정정 · 제보
정정·제보는 댓글로 남겨 주세요.