java나 어떤 언어에서든지 숫자나 단순 알파벳으로 이루어진 문자열의 정렬은 쉽게 상상할 수 있다.
숫자의 경우 두 수를 빼고 그 결과값을 리턴하고, 문자의 기준 문자의 첫 자리 알파벳 부터 아스킷 코드를 기준으로 알파벳을 빼서 그 결과값을 리턴하게 된다. 결과적으로 'a' - 'b' = -1 과 같은 결과가 리턴되는 샘.
문제는 a1, a10, a11, a19, a100, a101 과 같이 문자열에 숫자가 포함되어 있는 경우이다.
단순히 생각하면 a1보단 a10이 크고 a10보단 a19가 크고, a19 보단 a100이 클것 같지만 결과는 아래와 같다.
테스트 코드
import java.util.Arrays;
public class StringSortTest {
public static void main(String[] args) {
String[] arr = new String[9];
arr[0] = "a1";
arr[1] = "a10";
arr[2] = "a11";
arr[3] = "a19";
arr[4] = "a100";
arr[5] = "a101";
arr[6] = "a2";
arr[7] = "a21";
arr[8] = "a200";
Arrays.sort(arr);
for(String str : arr) {
System.out.print(str + " ");
}
}
}
결과
a1 a10 a100 a101 a11 a19 a2 a200 a21
결과적으로 문자열의 순서와 일치하게 문자열 안에서 숫자의 순서는, 비교를 시작할때 첫 자리수가 더 큰 알파벳(숫자) 가 크면 이후 자릿수와 무관하게 무조건 더 크다. 앞 자릿수의 알파벳(or 숫자) 가 같으면서 자릿수만 다르면 자릿수가 큰 숫자가 더 크다.
예를 들어
a1 보다 a10을 더 크게 본다. (앞에 수가 1로 끝날 때 뒤에는 자릿수가 더 큰 수가 무조건 더 크다.)
a10은 a2보다 자릿수가 크지만 자릿수를 비교하기 이전에 알파벳(or 숫자)이 a2는 2로 끝나고 a10은 1로 끝나기 때문에 a2가 무조건 더 크다.
위와 같은 원리로 a20x 보단 a21이 무조건 더 크다. 자리수 비교 이전에 a21(0,1 .. 9) 보단 a22가 무조건 크다.
설명을 하자니 더 복잡한 느낌인데 알파벳 정렬에 대한 코드를 직접 분석해보는 것도 좋을거 같다.
아래 링크는 언어별 알파벳 비교 코드
http://www.davekoelle.com/alphanum.html
'Java' 카테고리의 다른 글
추상클래스(Abstract class)와 인터페이스(Interface) (0) | 2020.10.24 |
---|---|
List.subList() 함수의 유의점 (0) | 2020.09.19 |
특수 문자 출력 (0) | 2020.08.10 |
java Array default value 자바 배열 초기값 (0) | 2020.08.08 |