728x90
Java 의 List.sort() 메서드를 활용하여 복잡한 정렬 규칙을 간단히 구현해봅시다.
[문제]
xx.yy.zz 형식의 문자열 숫자를 정렬하고자 합니다.
정렬 조건은 다음과 같습니다.
yy, zz, xx 순의 우선 순위를 갖는다.
예를 들어, "80.30.30" 과 "10.30.60" 의 두 문자열을 정렬할 때,
1. yy 자리 비교
30 == 30 이므로 비교 불가
2. zz 자리 비교
30 < 60 이므로 2번째 문자열이 더 크다고 할 수 있습니다.
이와 같은 형식을 가진 문자열들을 오름차순/내림차순으로 정렬하는 방법을 구현해봅시다.
[오름차순 정렬]
import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args) throws Exception {
List<String> numbers = new ArrayList<>();
numbers.add("10.20.30");
numbers.add("8.30.48");
numbers.add("10.20.60");
numbers.add("30.10.30");
numbers.add("10.10.10");
numbers.add("9.0.1");
numbers.add("8.15.30");
numbers.add("9.15.30");
// 오름차순 정렬
numbers.sort((a, b) -> {
String[] partsA = a.split("\\.");
String[] partsB = b.split("\\.");
//1순위 : yy 자리 비교
if (partsA[1] != partsB[1]) return Integer.parseInt(partsA[1]) - Integer.parseInt(partsB[1]);
//2순위 : zz 자리 비교
if (partsA[2] != partsB[2]) return Integer.parseInt(partsA[2]) - Integer.parseInt(partsB[2]);
//3순위 : xx 자리 비교
return Integer.parseInt(partsA[3]) - Integer.parseInt(partsB[3]);
});
System.err.println("오름차순 정렬 결과");
for (String num : numbers) {
System.out.println(num);
}
}
}
/**
오름차순 정렬 결과
9.0.1
30.10.30
10.10.10
8.15.30
9.15.30
10.20.30
10.20.60
8.30.48
**/
[내림차순 정렬]
import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args) throws Exception {
List<String> numbers = new ArrayList<>();
numbers.add("10.20.30");
numbers.add("8.30.48");
numbers.add("10.20.60");
numbers.add("30.10.30");
numbers.add("10.10.10");
numbers.add("9.0.1");
numbers.add("8.15.30");
numbers.add("9.15.30");
// 내림차순 정렬
numbers.sort((a, b) -> {
String[] partsA = a.split("\\.");
String[] partsB = b.split("\\.");
//1순위 : yy 자리 비교
if (partsA[1] != partsB[1]) return (Integer.parseInt(partsA[1]) - Integer.parseInt(partsB[1])) * -1;
//2순위 : zz 자리 비교
if (partsA[2] != partsB[2]) return (Integer.parseInt(partsA[2]) - Integer.parseInt(partsB[2])) * -1;
//3순위 : xx 자리 비교
return (Integer.parseInt(partsA[3]) - Integer.parseInt(partsB[3])) * -1;
});
System.err.println("내림차순 정렬 결과");
for (String num : numbers) {
System.out.println(num);
}
}
}
/**
내림차순 정렬 결과
8.30.48
10.20.30
10.20.60
8.15.30
9.15.30
30.10.30
10.10.10
9.0.1
**/
오름차순은 List.sort() 의 반환 값을 a 속성 데이터 - b 속성 데이터 로 구성하고,
내림차순은 반환 값을 b 속성 데이터 - a 속성 데이터로 구성합니다.
즉 List.sort() 는 기본적으로 오름차순으로 구성되어 있습니다.
이 글에서 말하고자 하는 중요한 점은 다음과 같습니다.
1. List.sort() 메서드로 정렬 방식을 사용자가 커스텀 할 수 있다.
2. List.sort() 는 기본적으로 '오름차순'으로 설정되어 있다.
+) String.split() 메서드의 파라미터는 정규형으로 작성해야 한다.
728x90