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 더 살펴보기
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로 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=andrew, age=32), User(name=robert, age=40)]
📚 Related Posts
- Java partitioningBy 예제 코드: 데이터 분할 작업을 간편하게 해보자
- [Java] Stream 데이터 groupingBy 예제
- Jackson, LocalDateTime Serialization, Deserialization 이슈
- [Java] 정렬 API (Array, Collection, Comparator)
- [Java] 파일 입출력(BufferedWriter, BufferedReader, Files)
- [Java] CompletableFuture 사용 방법
- [Java] 날짜,시간의 역사와 LocalDateTime 살펴보기
- Modern Java in Action #2. 동작파라미터화 코드 전달하기
- [Java] Comparable vs Compartor 사용 방법
- [Java] 리플렉션(Reflection)이란?
- 다양한 예제로 알아보는 자바(Java) 역순 정렬