개발을 하는 과정에서 종종 값이 숫자 또는 문자 값 자체를 정렬해야 하는 경우가 종종 있다.
이러한 경우 어떻게 정렬 하는지에 대해 알아보자
숫자 35124687을 정렬하는 방법은 뭐가 있을까?
또는 "gsvatcvaq"같은 문자열을 순서대로 정렬하는 방법은?
간단하게 정렬 하는 방법은 값을 배열 형태로 만들어서 Arrays.sort 메소드를 이용하여 정렬하면 오름차순은 간단하게 할 수 있지만, 내림차순 등 다른 방식으로
sort메소드는 인자로 2개의 값을 인자로 받아서 비교하여 양수 또는 음수로 리턴하여 정렬 합니다.
static void valueSortASC() {
int number = 35124687;
// 1.String.valueOf메소드로 문자열로 변환
String numberToStr = String.valueOf(number);
// 2.String에 구현되어 있는 toCharArray메소드로 char[] 형태로 변환
char[] strToCharArr = numberToStr.toCharArray();
// 3.Arrays에 구현되어 있는 sort메소드로 오름차순으로 변환(1,2,3,...)
Arrays.sort(strToCharArr);
// 정렬된 char[]을 String.valutOf()메소드로 다시 문자열로 변환
String charArrToStr = String.valueOf(strToCharArr);
// 마지막으로 String을 Integer에 구현되어 있는 parseInt메소드로 int값으로 변환
int result = Integer.parseInt(charArrToStr);
System.out.println(result);
// 출력 : 12345678
}
sort메소드의 기본적인 정렬은 오름차순으로 sort메소드에 인자로 정렬하고자 하는 값을 전달하면 되는데 우리가 정렬해야 하는 값은 배열 형태가 아닌 값 자체이기 때문에 배열로 변환하는 작업을 거쳐서 배열로 전환 후에 정렬을 하고 다시 값으로 변환하면 된다.
만약 역순이나 다른 방식으로 정렬하기 원한다면 Comparator의 compare를 구현하여 전달하면 정렬하는 방식을 바꿀 수 있습니다.
Compare를 구현하여 전달하게 되면 int와 같은 원시 타입은 사용이 불가능하여 해당하는 타입의 Wrapper(래퍼)클래로 전환하여 새로운 배열에 값을 복사하여 전달해야 합니다.
아래는 compare를 구현하여 전달해서 역순으로 정렬한 예제입니다.
static void valueSortDESC() {
int number = 35124687;
// 1.String.valueOf메소드로 문자열로 변환
String numberToStr = String.valueOf(number);
// 2.char[]이 아닌 Character[]로 해야함
Character[] strToCharArr = new Character[numberToStr.length()];
for (int i = 0; i < numberToStr.length(); i++) {
strToCharArr[i] = numberToStr.charAt(i);
}
// 3.Arrays에 구현되어 있는 sort메소드로 내림차순으로 변환(1,2,3,...)
Arrays.sort(strToCharArr, new Comparator<Character>() {
@Override
public int compare(Character o1, Character o2) {
return o2 - o1; // o2 - o1 역순, o1 - o2 정순
}
});
// 4.stringBuilder를 이용하여 string 형태로 전환
StringBuilder stringBuilder = new StringBuilder();
for (Character i : strToCharArr) {
stringBuilder.append(i);
}
// 5. result에 int로 변환하여 저장
int result = Integer.parseInt(stringBuilder.toString());
System.out.println(result);
}