코딩테스트
[Java] compare 메서드 Override, 특정 규칙에 따라 정렬하기
mingg123
2021. 7. 25. 14:29
방법 1
Arrays.sort 내에서 compare 메서드 override
compareTo 함수는 int의 경우 비교값 a, b가 있을 때
a > b 일 경우 result = 1
a = b 일 경우 result = 0
a < b 일 경우 result = -1
import java.util.*;
class Solution {
public int compareNumber (String o1, String head) {
String num = o1.substring(head.length());
String newStr = "";
// TAIL을 제외한 방법
for(int i = 0; i < num.length(); i++) {
if(Character.isDigit(num.charAt(i))) {
newStr = newStr + Character.toString(num.charAt(i));
} else break;
}
return Integer.parseInt(newStr);
}
public String[] solution(String[] files) {
String[] answer = new String[files.length];
//Compare 메서드 오버라이드
Arrays.sort(files, new Comparator<String> () {
@Override
public int compare(String o1, String o2) {
String head1 = o1.split("[0-9]")[0];
String head2 = o2.split("[0-9]")[0];
int result = head1.toLowerCase().compareTo(head2.toLowerCase());
//head가 같을경우
if(result == 0) {
result = compareNumber(o1, head1) - compareNumber(o2, head2);
}
return result;
}
});
return files;
}
}
방법 2
클래스에서 Comparator 인터페이스의 compare 메서드를 override한다.
//interface compare 메서드를 override한 class 정의
class CustomComparator implements Comparator<String> {
@Override
public int compare(String o1, String o2) {
String head1 = o1.split("[0-9]")[0];
String head2 = o2.split("[0-9]")[0];
int result = head1.toLowerCase().compareTo(head2.toLowerCase());
//head가 같을경우
if(result == 0) {
result = compareNumber(o1, head1) - compareNumber(o2, head2);
}
return result;
}
}
방법 2를 사용한 전체 코드
import java.util.*;
class Solution {
class CustomComparator implements Comparator<String> {
@Override
public int compare(String o1, String o2) {
String head1 = o1.split("[0-9]")[0];
String head2 = o2.split("[0-9]")[0];
int result = head1.toLowerCase().compareTo(head2.toLowerCase());
//head가 같을경우
if(result == 0) {
result = compareNumber(o1, head1) - compareNumber(o2, head2);
}
return result;
}
}
public int compareNumber (String o1, String head) {
String num = o1.substring(head.length());
String newStr = "";
// TAIL을 제외한 방법
for(int i = 0; i < num.length(); i++) {
if(Character.isDigit(num.charAt(i))) {
newStr = newStr + Character.toString(num.charAt(i));
} else break;
}
return Integer.parseInt(newStr);
}
public String[] solution(String[] files) {
String[] answer = new String[files.length];
//Compare 메서드 오버라이드
Arrays.sort(files, new CustomComparator());
return files;
}
}
관련된 문제
https://programmers.co.kr/learn/courses/30/lessons/17686