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

 

+ Recent posts