반환 값에 따른 정렬 함수의 해석
반환 값 < 0 : a가 b보다 앞에 있어야 한다.
반환 값 = 0 : a와 b의 순서를 바꾸지 않는다.
반환 값 > 0 : b가 a보다 앞에 있어야 한다.
왜 오름차순이면 return a-b , 내림차순이면 return b-a를 해주는지 확실하게 알 수 있다. 자동으로 위의 규칙을 만족하기 때문이다.
예를들어 a,b 두 값이 있고, 내림차순을 원할 때 b-a를 하는 이유는, 만약 a<b 라면 b-a가 양수이므로 b가 앞으로, a가 뒤로 간다.
또 만약 a>b라면 b-a가 음수이므로 a가 앞으로, b가 뒤로 간다. 따라서 내림차순을 자동으로 만족한다.
아래는 정렬 정리.
1. 1차원 배열 정렬 (int[])
import java.util.Arrays;
public class Main {
public static void main(String[] args) {
int[] arr = {5, 2, 9, 1, 5, 6};
Arrays.sort(arr); // 오름차순 정렬
System.out.println(Arrays.toString(arr)); // [1, 2, 5, 5, 6, 9]
}
}
2. 1차원 배열 내림차순 정렬 (Integer[])
import java.util.Arrays;
import java.util.Collections;
public class Main {
public static void main(String[] args) {
Integer[] arr = {5, 2, 9, 1, 5, 6};
Arrays.sort(arr, Collections.reverseOrder()); // 내림차순 정렬
System.out.println(Arrays.toString(arr)); // [9, 6, 5, 5, 2, 1]
}
}
주의: int[]는 안 되고 Integer[] 써야 Collections.reverseOrder()가 먹힘.
3. 리스트 (List<Integer>) 정렬
import java.util.*;
public class Main {
public static void main(String[] args) {
List<Integer> list = Arrays.asList(5, 2, 9, 1, 5, 6);
Collections.sort(list); // 오름차순
System.out.println(list); // [1, 2, 5, 5, 6, 9]
list.sort(Collections.reverseOrder()); // 내림차순
System.out.println(list); // [9, 6, 5, 5, 2, 1]
}
}
리스트는 Collections.sort() 또는 list.sort() 둘 다 가능.
4. 2차원 배열 정렬 (특정 인덱스 기준)
(예) 2차원 배열을 [0] 번째 값 기준 오름차순
import java.util.Arrays;
public class Main {
public static void main(String[] args) {
int[][] arr = {
{5, 2},
{1, 7},
{3, 4}
};
// 오름차순
Arrays.sort(arr, (a, b) -> Integer.compare(a[0], b[0]));
// 내림차순 (b[0], a[0] 순서 바꾸면 내림차순!)
Arrays.sort(arr, (a, b) -> Integer.compare(b[0], a[0]));
// 만약 0번째 요소가 같으면 1번째 요소 기준 오름차순
Arrays.sort(arr, (a, b) -> {
if (a[0] == b[0]) return Integer.compare(a[1], b[1]);
return Integer.compare(a[0], b[0]);
});
}
}
5. 클래스 객체 정렬
(예: Person 클래스의 나이(age) 기준으로 정렬)
import java.util.*;
class Person {
String name;
int age;
Person(String name, int age) {
this.name = name;
this.age = age;
}
}
public class Main {
public static void main(String[] args) {
List<Person> people = Arrays.asList(
new Person("Alice", 30),
new Person("Bob", 20),
new Person("Charlie", 25)
);
people.sort(Comparator.comparingInt(p -> p.age));
for (Person p : people) {
System.out.println(p.name + " " + p.age);
}
}
}
- Comparator.comparingInt(람다)
- 또는 Comparable을 상속하여 compareTo 오버라이드 해도 됨.
- 또는 people.sort((p1, p2) -> Integer.compare(p1.age, p2.age)); 이런 식도 가능
정리
상황코드 | 한줄 요약 |
int[] 오름차순 | Arrays.sort(arr) |
Integer[] 내림차순 | Arrays.sort(arr, Collections.reverseOrder()) |
List 오름/내림차순 | Collections.sort(list) / list.sort(Collections.reverseOrder()) |
2차원배열 특정요소 기준 오름차순 | Arrays.sort(arr, (a, b) -> Integer.compare(a[idx], b[idx])) |
객체 정렬 | list.sort(Comparator.comparing(람다)) |
문제 세트 (정렬 실전 연습)
1. int[] 오름차순, 내림차순
[문제1]
정수 배열 arr = {7, 2, 9, 4, 1, 5}가 주어졌을 때,
- 오름차순 정렬한 결과를 출력하라.
- 내림차순 정렬한 결과를 출력하라.
import java.util.Arrays;
import java.util.Collections;
public class Test {
public static void main(String[] args) {
int[] arr = {7, 2, 9, 4, 1, 5};
Arrays.sort(arr);
System.out.println(Arrays.toString(arr)); // [1, 2, 4, 5, 7, 9]
Integer[] boxedArr = Arrays.stream(arr).boxed().toArray(Integer[]::new);
Arrays.sort(boxedArr, Collections.reverseOrder());
System.out.println(Arrays.toString(boxedArr)); // [9, 7, 5, 4, 2, 1]
}
}
2. 2차원 int 배열 특정 열 기준 정렬
[문제2]
2차원 배열 arr = { {3, 5}, {1, 7}, {4, 2}, {2, 2} }가 있다.
- [1] 번째 값을 오름차순으로 정렬하고 출력하라.
import java.util.Arrays;
import java.util.Comparator;
public class Test {
public static void main(String[] args) {
int[][] arr = { {3, 5}, {1, 7}, {4, 2}, {2, 2} };
Arrays.sort(arr, (a,b) -> a[1] - b[1]);
System.out.println(Arrays.deepToString(arr)); // [[4, 2], [2, 2], [3, 5], [1, 7]]
// 결과는 위와 같음 (Comparator 직접사용)
Arrays.sort(arr, Comparator.comparingInt(a -> a[1]));
System.out.println(Arrays.deepToString(arr)); // [[4, 2], [2, 2], [3, 5], [1, 7]]
}
}
[문제3]
위 배열을
- [1] 번째 값을 오름차순 정렬하고,
- 만약 [1] 값이 같으면 [0] 값을 내림차순으로 정렬하라.
import java.util.Arrays;
import java.util.Comparator;
public class Test {
public static void main(String[] args) {
int[][] arr = { {3, 5}, {1, 7}, {4, 2}, {2, 2} };
Arrays.sort(arr, (a,b) -> {
if (a[1] == b[1]) return b[0] - a[0];
return a[1] - b[1];
});
System.out.println(Arrays.deepToString(arr)); // [[4, 2], [2, 2], [3, 5], [1, 7]]
// Comparator 방식 (가독성용)
Arrays.sort(arr, Comparator
.comparingInt((int[] a) -> a[1]) // [1] 오름차순
.thenComparing((a, b) -> b[0] - a[0]) // [0] 내림차순
);
System.out.println(Arrays.deepToString(arr)); // [[4, 2], [2, 2], [3, 5], [1, 7]]
}
}
3. Integer[] 배열 내림차순
[문제4]
정수 배열 arr = {3, 6, 1, 8, 2}가 주어졌을 때,
- Integer[]로 변환해서 내림차순 정렬하고 출력하라.
import java.util.Arrays;
import java.util.Collections;
public class Test {
public static void main(String[] args) {
int[] arr = {3, 6, 1, 8, 2};
Integer[] boxedArr = Arrays.stream(arr).boxed().toArray(Integer[]::new);
Arrays.sort(boxedArr, Collections.reverseOrder());
System.out.println(Arrays.toString(boxedArr)); //[8, 6, 3, 2, 1]
}
}
4. List<Integer> 오름차순/내림차순
[문제5]
리스트 list = [5, 1, 9, 3, 2]가 주어졌을 때,
- 오름차순 정렬한 결과 출력
- 내림차순 정렬한 결과 출력
public class Test {
public static void main(String[] args) {
List<Integer> list = Arrays.asList(5,1,9,3,2);
Collections.sort(list);
System.out.println(list); // [1, 2, 3, 5, 9]
Collections.sort(list, Collections.reverseOrder());
System.out.println(list); // [9, 5, 3, 2, 1]
}
}
5. 문자열 2차원 배열 정렬
[문제6]
2차원 문자열 배열 arr = { {"banana", "yellow"}, {"apple", "red"}, {"cherry", "red"} }가 있다.
- [0]번째 문자열을 기준으로 오름차순 정렬하라.
import java.util.Arrays;
public class Test {
public static void main(String[] args) {
String[][] arr = { {"banana", "yellow"}, {"apple", "red"}, {"cherry", "red"} };
Arrays.sort(arr,(a,b) -> a[0].compareTo(b[0]));
System.out.println(Arrays.deepToString(arr));
}
}
6. 문자열 다중 조건 정렬
[문제7]
2차원 문자열 배열 arr = { {"banana", "yellow"}, {"banana", "green"}, {"apple", "red"}, {"cherry", "red"} }가 있다.
- [0]번째 문자열을 오름차순 정렬하고,
- [0]번째가 같으면 [1]번째 문자열을 오름차순으로 정렬하라.
import java.util.Arrays;
import java.util.Comparator;
public class Test {
public static void main(String[] args) {
String[][] arr = { {"apple", "yellow"}, {"banana", "red"}, {"apple", "red"} };
Arrays.sort(arr,(a,b) -> {
if (a[0].equals(b[0])) {
return a[1].compareTo(b[1]);
}
return a[0].compareTo(b[0]);
});
System.out.println(Arrays.deepToString(arr)); // [[apple, red], [apple, yellow], [banana, red]]
// comparator 사용
Arrays.sort(arr, Comparator.comparing((String[] a) -> a[0]) // 0기준 오름차순
.thenComparing(a -> a[1])); // 1기준 오름차순
// 오름차순 원할시엔 thenComparing((a,b) -> b[1].compareTo(a[1]);
System.out.println(Arrays.deepToString(arr));
}
}
'JAVA' 카테고리의 다른 글
의존성 주입(DI, Dependency Injection)은 무엇이고, 사용하는 이유는 뭘까? (1) | 2025.02.27 |
---|---|
자바 자료형 변환 정리 (0) | 2022.12.08 |
@AuthenticationPrincipal 사용시 LazyInitializationException (2) | 2022.11.19 |
Java compareTo(), compare()의 차이와 내림차순, NaN값 처리 (0) | 2022.10.27 |