반응형
자바 정렬 방법
1. Compatable
클래스 자체의 정렬 기준을 정하는 것
class A implements Comparable{
public int compareTo(Object obj){
return this.변수 - obj.변수;
}
}
예시
package algo0317;
import java.util.Arrays;
import java.util.Comparator;
public class ExamComparable {
private static final String Comparator = null;
public static void main(String[] args) {
// TODO Auto-generated method stub
Meeting[] ma = new Meeting[3];
ma[0] = new Meeting(1, 4);
ma[1] = new Meeting(3, 6);
ma[2] = new Meeting(0, 3);
System.out.println(Arrays.toString(ma));
Arrays.sort(ma);
System.out.println(Arrays.toString(ma));
}
}
//Meeting 클래스
/* 회의 정보 start = 시작 시간, end = 종료 시간 */
class Meeting implements Comparable<Meeting> { // 여기서 <Meeting> 은 비교 대상
int start, end;
public Meeting(int start, int end) {
this.start = start;
this.end = end;
}
@Override
public int compareTo(Meeting o) {
return this.end - o.end;// 종료시간을 기준으로 정렬
// 양수면 앞에가 더 큰 것을 의미
// 음수면 뒤에가 더 큰 것을 의미
}
@Override
public String toString() {
return start + "-" + end;
}
}
2. Comparator(정렬기)
정렬 방법을 정의하는 것
사용자 정의 정렬기 : Interface
클래스로 구현
class StartTimeComparator implements Comparator<Meeting> {
@Override
public int compare(Meeting o1, Meeting o2) {
return o1.start - o2.start; // 오름차순 정렬
}
}
위와 같이 클래스로 정의할 수 있다.
그러나, 클래스 안만들고 익명으로 만드는 방식이 있다. 이를 Anonymous Class라고 부른다. ( 익명 클래스 )
Anonymous Class
상속, 인터페이스 구현시 생성할 클래스의 이름을 부여해야 하는 것이 정상이다.
그러나 구현할 메서드가 1개이거나 부모 타입의 모든 메서드들을 재 정의 할 때 클래스 이름을 생략할 수 있다.
/**재정의 예시**/
A a1 = new B();
a1 = new A() {
int prn() {
return 200;// 재 정 의
}
};
System.out.println(a1.prn());
System.out.println("클래스명은 " + a1.getClass().getName()); //algo0317.ExamComparable$1
//임의의 클래스명 첫번째 것의 의미로 $1이 출력된다.
/***************************************************/
ct = new Comparator<Meeting>() { //중괄호는 클래스를 의미. 이름은 자바가 내부적으로 붙혀줌.
@Override
public int compare(Meeting o1, Meeting o2) {
return o1.start - o2.start;
}
};
위와 같이 compare을 Override한다.
응용: 백준 1931
백준 1931 회의실 배정 문제를 기반으로, 응용을 해보자..
문제
https://www.acmicpc.net/problem/1931
1931번: 회의실 배정
(1,4), (5,7), (8,11), (12,14) 를 이용할 수 있다.
www.acmicpc.net
정렬 부분 코드
// 끝나는 시간을 기준으로 정렬. 이때 종료 시간이 같으면 시작 시간을 기준으로 정렬
Arrays.sort(time, new Comparator<int[]>() { // 정렬의 대상이 1차원 배열이다.
@Override
public int compare(int[] s, int[] e) {
if (s[1] == e[1]) { //종료 시간이 같은 경우
return s[0] - e[0]; //시작 시간을 기준으로 정렬한다.
}
return s[1] - e[1];
}
});
위와 같이 종료 시간을 기준으로 정렬이 가능하다.
반응형
'코딩기록 > 자바' 카테고리의 다른 글
[자바의 정석] 지네릭스 (0) | 2024.01.24 |
---|---|
[자바의 정석] 클래스 멤버 변수, 인스턴스 멤버 변수 구분하기 (0) | 2023.03.09 |
[이것이 자바다] Ch6. 클래스 (0) | 2023.03.07 |
[이것이 자바다] Ch5. 참조타입 (0) | 2023.01.20 |
[이것이 자바다] Ch4. 조건문과 반복문 (0) | 2023.01.17 |