보글보글 개발일지
article thumbnail
Published 2023. 3. 17. 10:55
자바 정렬 방법 코딩기록/자바
반응형

자바 정렬 방법

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개이거나 부모 타입의 모든 메서드들을 재 정의 할 때 클래스 이름을 생략할 수 있다.

anonymous 형태를 제공
시작시간을 기준으로 정렬시 이와같은 결과가 나온다.

		/**재정의 예시**/
		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];
			}
		});

위와 같이 종료 시간을 기준으로 정렬이 가능하다.

반응형
profile

보글보글 개발일지

@보글

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!