본문 바로가기
공부/Java

[Java]Comparable / Comparator 인터페이스 특징과 차이 정리

by happyeuni 2023. 1. 5.
  • Comparable 인터페이스 - 원소 자신과 상대 비교
    • int CompareTo(T other) 오버라이딩 해야함 ( 매개 변수로 받는 타원소와 비교)
  • Comparator 인터페이스 - 제 3자의 도우미. 두 원소를 받아서 비교
    • int Comparator(T o1, T o2) : 둘을 비교하기 위해 매개변수 받음
  • 음수 : Comparable - 타원소가 크다 / Comparator -  o1<o2
    양수 : Comparable - 자신이 크다    / Comparator -  o1>o2
    0 : 둘이 같다
  • 보통 오름차순.
    내림차순 하고 싶으면 부호를 반대로 취하기

java.lang.Comparable<T>

class Student implements Comparable<Student>{
	int no, score;

	public Student(int no, int score){
		super();
		this.no = no;
		this.score = score;
	}

	@Override
	public int compareTo(Student o){
		return this.no - o.no; //오름차순
		// return o.no - this.no; //내림차순
	}
}

java.util.Comparator<T>

class Student{
	int no, score;
	
	public Student(int no, int score){
		super();
		this.no = no;
		this.score = score;
	}
}

class StudentComparator implements Comparator<Student>{
	@Override
	public int compare(Student o1, Student o2){
		return o1.no - o2.no; 
	}
}

 

그럼 언제 뭘 써야해?

  • 직접 custom class 작성한 경우

      → Comparable 인터페이스 구현 implements한 뒤 compareTo 오버라이드

 

  • 만약 class를 직접 쓴게 아니라 가져다 써서 변경하지 못할 경우 implements 불가능한 경우
    or
    String 같은 API에 있는 comparable의 compareTo가 맘에 안드는 경우

       → 새로운 클래스 만들어서 Comparator 인터페이스 구현 implements한 뒤 compareTo 오버라이드

 

 

기준이 두 개일 경우 정렬 예시(+ 문자열 정렬하는 법)

package Sorting;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;

public class TB6_11 {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int N = Integer.parseInt(br.readLine());
        List<Student> list = new ArrayList<>();

        for (int i = 0; i < N; i++) {
            StringTokenizer st = new StringTokenizer(br.readLine());
            list.add(new Student(st.nextToken(),Integer.parseInt(st.nextToken())));
        }

        Collections.sort(list);

        for (int i = 0; i < N; i++) {
            System.out.print(list.get(i).name + " ");
        }

    }

    static class Student implements Comparable<Student> {
        String name;
        int score;

        public Student(String name, int score){
            super();
            this.name = name;
            this.score = score;
        }

        @Override
        public int compareTo(Student o) {
            if(this.score == o.score){
                return this.name.compareTo(o.name);
            }
            return this.score - o.score; // 오름차순
        }
    }
}

 

댓글