# Comparator + 람다식 → 커스텀 정렬
---
## 1. 기본 구조
```java
Arrays.sort(배열, (a, b) -> {
return 비교값;
});
```
- 자바에서 배열을 정렬할 때, `Comparator`를 람다식으로 넘겨 정렬 기준을 직접 지정할 수 있다.
- Comparator는 객체 타입인 Integer에만 사용할 수 있기 때문에 int\[\] → Integer\[\] 변환이 필요할 때가 있다.
---
## 1.1 Comparator 람다식 반환값 기준
반환값
| 의미
| 정렬 결과
|
---|
음수 (`< 0`)
| a가 b보다 작다
| a가 앞에 옴
|
0
| a와 b가 같다
| 순서 유지
|
양수 (`> 0`)
| a가 b보다 크다
| b가 앞에 옴
|
---
## 2. 자주 사용하는 커스텀 정렬
### 2.1 오름차순 정렬 (작은 수 → 큰 수)
```java
Arrays.sort(arr, (a, b) -> a - b);
```
### 2.2 내림차순 정렬 (큰 수 → 작은 수)
```java
Arrays.sort(arr, (a, b) -> b - a);
```
### 2.3 절댓값 기준 오름차순 정렬
```java
Arrays.sort(arr, (a, b) -> Math.abs(a) - Math.abs(b));
```
### 2.4 절댓값 기준 + 값이 같으면 큰 수 우선
```java
Arrays.sort(arr, (a, b) -> {
int diff = Math.abs(a) - Math.abs(b);
if (diff == 0) return b - a; // 절댓값 같으면 큰 수 우선
return diff;
});
```
---
## 3. 정리
목적
| 정렬식
|
---|
기본 오름차순
| `(a, b) -> a - b`
|
기본 내림차순
| `(a, b) -> b - a`
|
절댓값 기준
| `(a, b) -> Math.abs(a) - Math.abs(b)`
|
절댓값 + 값이 같으면 큰 수 우선
| `(a, b) -> { ... if문으로 처리 }`
|
---
## 4. List 정렬
### 4.1 기본 오름차순 정렬
```java
List list = Arrays.asList(3, 1, 5, 2);
Collections.sort(list); // 기본 오름차순
```
### 4.2 내림차순 정렬 (람다식 사용)
```java
list.sort((a, b) -> b - a); // 또는 Collections.sort(list, (a, b) -> b - a);
```
### 4.3 절댓값 기준 정렬
```java
list.sort((a, b) -> Math.abs(a) - Math.abs(b));
```
---
## 5. 객체 정렬
### 5.1 방법 1: Comparable 인터페이스 (자기 자신 기준 정렬)
#### 예시 클래스
```java
class Person implements Comparable {
String name;
int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public int compareTo(Person other) {
return this.age - other.age; // 나이 오름차순 정렬
}
}
```
#### 사용 방법
```java
List list = new ArrayList<>();
list.add(new Person("Alice", 25));
list.add(new Person("Bob", 20));
Collections.sort(list); // compareTo() 기준으로 정렬됨
```
---
### 5.2 방법 2: Comparator 인터페이스 (외부 기준 정렬)
#### 예시 1: 이름 기준 정렬 (오름차순)
```java
list.sort(Comparator.comparing(p -> p.name));
```
#### 예시 2: 나이 내림차순 정렬
```java
list.sort((p1, p2) -> p2.age - p1.age);
```
---
## 6. 정리 요약
구분
| 인터페이스
| 사용 위치
| 정렬 기준 변경
|
---|
Comparable
| `compareTo()`
| 클래스 내부 정의
| 고정 (자기 기준)
|
Comparator
| `compare()`
| 외부에서 전달
| 유동적 (다양한 기준 가능)
|
---
- `Comparable`: "나는 정렬 방법을 ****내가 정한다****!" (클래스 안에서 정의)
- `Comparator`: "정렬 기준은 ****밖에서 주입한다****!" (상황에 따라 유연하게)