CS/Algorithm

[Algorithm/JAVA] Comparator, Comparable

칸타탓 2021. 1. 31. 16:50

Comparable 인터페이스 (java.lang)

객체 간의 일반적인 정렬이 필요할 때, Comparable 인터페이스를 확장한다.

정렬할 객체에 Comparable 인터페이스를 implements 한 후, CompareTo() 메서드를 오버라이드 하여 정렬

 

CompareTo()

- 현재 객체 < 파라미터로 넘어온 객체 : 음수 리턴

- 현재 객체 = 파라미터로 넘어온 객체 : 0 리턴

- 현재 객체 > 파라미터로 넘어온 객체 : 양수 리턴

 

Comparator 인터페이스 (java.util)

객체 간의 특정한 정렬이 필요할 때, Comparator 인터페이스를 확장해서 특정 기준을 정의하는 compare() 메서드를 구현한다.

기본적인 정렬 기준과 다르게 정렬하고 싶을 때 사용

Comparator 인터페이스를 implements 한 후, compare() 메서드를 오버라이드한 클래스를 작성한다.

 

compare()

- 첫 번째 파라미터로 넘어온 객체 < 두 번째 파라미터로 넘어온 객체 : 음수 리턴 (유지)
- 첫 번째 파라미터로 넘어온 객체 = 두 번째 파라미터로 넘어온 객체 : 0 리턴 (유지)

- 첫 번째 파라미터로 넘어온 객체 > 두 번째 파라미터로 넘어온 객체 : 양수 리턴 (두 객체 자리 변경)

 

역으로 정렬하기 예제(내림차순)

Arrays.sort(time, new Comparator<int[]>() {
	@Override
	public int compare(int[] o1, int[] o2) {
		// 0: 시작 시간, 1: 종료 시간
		// 끝시간이 같을 경우 시작 시간 정렬
		if(o1[1] == o2[1]) {
			return Integer.compare(o1[0], o2[0]);
		}
		// 종료 시간 정렬
		return Integer.compare(o1[1], o2[1]);
	}
});

객체 정렬 예제 (나이를 기준으로 객체 정렬)

public static void main(String[] args) {
    Student s1 = new Student("name1", 27); 
    Student s2 = new Student("name2", 31); 
    Student s3 = new Student("name3", 30);
    
    Student[] arr = new Student[]{s1, s2, s3};
    
    Arrays.sort(arr, new Comparator<Student>() {
        @Override
        public int compare(Student o1, Student o2) {
            return o1.getAge() - o2.getAge();
        }
    });
    
    for(Student s : arr) {
        System.out.println(s.getName() + " " + s.getAge());
    }
}

 

 

 

'CS > Algorithm' 카테고리의 다른 글

[Algorithm] 그래프(Graph)  (0) 2020.11.15
[Algorithm/Java] Iterator, ListIterator  (0) 2020.11.14
[Algorithm/Java] LinkedList 자료구조  (0) 2020.11.14
[Algorithm] BFS, 너비 우선 탐색  (0) 2020.11.14
[Algorithm] DFS, 깊이 우선 탐색  (0) 2020.11.02