자바 - Comparable과 Comparator

namkun·2022년 1월 8일
0

JAVA

목록 보기
1/20

코테문제 풀어보다가 관련해서 나왔길래 한 번 정리해봅니다.


오늘 비교해 볼건 모두 인터페이스이다.

그렇기에 사용하려면, 해당 인터페이스 안에 구현되어있는 메서드 역시 구현해줘야만 한다.

Comparable

  • 자기 자신과 파라미터를 통해 들어오는 객체와의 비교
  • lang에 속해있기에, import 할 필요가 없음

사용방법

  • 정렬할 객체에 Comparable 인터페이스를 implements 하고, compareTo() 메서드를 반드시 구현해야한다.
  • implements 할때, Comparable에 해당 객체와 비교하고 싶은 객체의 class를 넣어주면 된다.
    예를 들어서, test 객체를 생성해서 test 객체끼리 비교하고 싶을 땐 아래처럼 구현한다.
	class test implements Comparable<test>{
    		...
    	}
  • compareTo 메서드는 int 값을 return 해주는데, return해주는 값의 의미는 다음과 같다.
    • 양수는 내 자신의 값이 변수를 통해 들어온 것보다 크다는 의미이다.
    • 0 은 내 자신과 변수로 들어온 값이 같다는 의미이다.
    • 음수는 내 자신보다 변수로 들어온 값이 크다는 의미이다.
  • compareTo 메서드는 아래의 예시처럼 구현해준다.
  Class Test implements Comparable<Test>{
      int score;
      int rank;

      Test(int score, int rank){
          this.score = score;
          this.rank = rank;
      }

      @Override
      public int compareTo(Test t){
	// 만약 내 점수가 변수로 들어온 객체의 점수보다 높다면 양수가 반환될 것이고, 낮다면 음수가 반환될 것이다.
    	// 꼭 이렇게 하지 않아도, 1, 0, -1 을 조건에 맞춰서 반환해줘도 된다.
    	return this.score - t.score;
      }
  }
  • 기본 정렬은 오름차순 정렬이 된다. (작은 값 -> 큰 값)
  • Arrays.sort(), Collections.sort()와 같은 정렬 메서드에, 해당 클래스가 들어간 배열이나 리스트를 던져주면 정렬해준다.
Test [] arr = new Test[3];
arr[0] = new Test(10, 3);
arr[1] = new Test(20, 1);
arr[2] = new Test(15, 2);

Arrays.sort(arr); // sort!

ArrayList<Test> list = new ArrayList<>();
list.add(new Test(10, 3));
list.add(new Test(20, 1));
list.add(new Test(15, 2));

Collections.sort(list); // sort!

Comparator

  • Comparable로 정의한 정렬규칙 이외에 다른 정렬규칙으로 정렬을 하고 싶을 때 사용한다.
  • 두 매개 변수 객체를 받아 비교한다.
  • util 에 있어 import 해야 한다.
  • Comparable과 정렬 메커니즘은 비슷하나, 사용방법은 Comparable과는 조금 다르다. 익명의 클래스를 만들어 정렬시에 기준으로 쥐어준다.
// 익명 클래스 생성
Comparator<Test> rankComparator = new Comparator<Test>(){
	@Override
    public int compare(Test t1, Test t2){
	if(t1.rank < t2.rank){return 1;}
    	else if(t1.rank == t2.rank){return 0;}
    	else return -1;
    }
}


Test [] arr = new Test[3];
arr[0] = new Test(10, 3);
arr[1] = new Test(20, 1);
arr[2] = new Test(15, 2);

Arrays.sort(arr, rankComparator); // sort!

ArrayList<Test> list = new ArrayList<>();
list.add(new Test(10, 3));
list.add(new Test(20, 1));
list.add(new Test(15, 2));

Collections.sort(list, rankComparator); // sort!

정리

Comparable

  • 해당 인터페이스를 구현한 객체 스스로에게 한 가지 정렬 규칙을 설정하는 목적으로 사용

Comparator

  • 해당 인터페이스를 구현한 클래스는 정렬 규칙 그 자체를 의미, 기본 정렬 규칙과 다른 정렬 규칙을 사용해서 정렬하고 싶을 때 사용
profile
개발하는 중국학과 사람

0개의 댓글