HEAD,NUMBER,TAIL로 나누고 HEAD를 비교 후 정렬, 만약 HEAD가 같다면 NUMBER를 비교후 정렬 하는 문제
https://subin-0320.tistory.com/103
Comparator<E>
클래스와 compare
메소드 오버라이딩에 대하여 잘 정리된 블로그
HEAD부분 대소문자 구분하지 않고 문자열 비교
//조건에 따른 정렬을 위해 Comparator
//compare 리턴값이 양수면 자리 바꾸고 0이면 숫자비교
Arrays.sort(files, new Comparator<String>(){
public int compare(String o1, String o2){
//숫자 앞부분을 잘라서 head 생성
String head1 = o1.split("[0-9]")[0];
String head2 = o2.split("[0-9]")[0];
//compareTo를 사용한 비교를 위해서는 모두 소문자로 변경 후 비교
int result = head1.toLowerCase().compareTo(head2.toLowerCase());
if(result == 0){ //같은 문자일 경우 숫자로 비교
result = convertNum(o1,head1) - convertNum(o2,head2);
}
return result;
}
NUMBER부분 정수 크기 비교
public static int convertNum(String str, String head){
str = str.substring(head.length()); //head길이 만큼 잘라서 num부터
String result = "";
for(char c: str.toCharArray()){
if(Character.isDigit(c) && result.length() < 5) //숫자이고 길이가 5이하인지 확인
result += c;
else
break;
}
return Integer.valueOf(result);
}
import java.util.*;
class Solution {
public String[] solution(String[] files) {
String[] answer = {};
//조건에 따른 정렬을 위해 Comparator
//compare 리턴값이 양수면 자리 바꾸고 0이면 숫자비교
Arrays.sort(files, new Comparator<String>(){
public int compare(String o1, String o2){
//숫자 앞부분을 잘라서 head 생성
String head1 = o1.split("[0-9]")[0];
String head2 = o2.split("[0-9]")[0];
//compareTo를 사용한 비교를 위해서는 모두 소문자로 변경 후 비교
int result = head1.toLowerCase().compareTo(head2.toLowerCase());
if(result == 0){ //같은 문자일 경우 숫자로 비교
result = convertNum(o1,head1) - convertNum(o2,head2);
}
return result;
}
});
return files;
}
public static int convertNum(String str, String head){
str = str.substring(head.length()); //head길이 만큼 잘라서 num부터
String result = "";
for(char c: str.toCharArray()){
if(Character.isDigit(c) && result.length() < 5) //숫자이고 길이가 5이하인지 확인
result += c;
else
break;
}
return Integer.valueOf(result);
}
}
Character.isDigit()
, Integer.valueOf()
, Comparator<E>
, compare(String, String)