[자바] Comparable을 이용해 Pair 클래스 정렬하기

Namgon·2021년 7월 2일
0

목록 보기
3/3

Camparable을 상속받고 Pair 클래스를 구현해 쌍으로 받는 데이터를 정렬하기

최근 코테를 Cpp에서 자바로 바꿔서 준비하면서 Cpp에 존재하는 Pair 기능이 딱히 없는 것 같았다. 해서 자바에서도 사용할 수 있게 다른 블로그들을 참고하며 Pair를 직접 만들어주었다. 헌데 Sort를 하는 과정에서 원하는 입맛대로 변환하려면 Comparable을 상속받아 사용하는 방법과 Comparator를 사용해 sort 인자에 추가 정렬 기준을 세운다는 것을 알았다. 개인적으로 전자인 상속받는 방법이 편했고 유용하게 사용할 것 같아서 블로그에 글로 정리한다.

코드

import java.util.*;

class Pair implements Comparable<Pair>{
   int first;
   int second;
   
   public Pair(int first, int second) {
      super();
      this.first = first;
      this.second = second;
   }
   
   // 첫번째꺼 기준으로 오름차순
   @Override
   public int compareTo(Pair p) {
      return Integer.compare(this.first, p.first);
   }
   
   // 첫번째꺼 기준으로 내림차순
   @Override
   public int compareTo(Pair p) {
      return Integer.compare(p.first, this.first);
   }

   // 첫번째꺼로 오름차순 만약 값이 같다면 두번째꺼로 오름차순
   @Override
   public int compareTo(Pair p) {
      if(this.first == p.first)
         return Integer.compare(this.second, p.second);
      else
         return Integer.compare(this.first, p.first);
   }
   

}
public class Test {
   public static void main(String[] args) {
      Pair p1 = new Pair(5, 2);
      Pair p2 = new Pair(2, 3);
      Pair p3 = new Pair(1, 2);
      Pair p4 = new Pair(5, 1);
      Pair p5 = new Pair(3, 2);
      Pair p6 = new Pair(6, 4);
      Pair p7 = new Pair(5, 3);
      
      PriorityQueue<Pair> pq = new PriorityQueue<>();
      pq.add(p1);
      pq.add(p2);
      pq.add(p3);
      pq.add(p4);
      pq.add(p5);
      pq.add(p6);
      pq.add(p7);
      System.out.println(pq.size());
      for(int i=0;i<7;i++) {
         Pair p = pq.poll();
         System.out.println("첫번째 : " + p.first +"두번째 : "+p.second);
      }
      
      
   }
}

설명

@Override를 통해 비교 기준을 세우는 compareTo를 재정의한다. 이때 내림차순과 오름차순이 햇갈릴 수 있어 Integer.compare를 사용했다. 오름차순을 진행하려면 this를 왼쪽에 두면 된다. 이와 비슷하게 compareTo함수도 사용할 수 있다. 문자열의 경우 (this.str).compareTo(pair.str)을 이용해주면 된다. 다른 정수나 혹은 실수들도 다음과 같이 사용할 수 있다.

정렬 기준을 여러개 새우는 경우에는 첫번째 기준이 같아 두번째 기준으로 진행할 경우로 계획을 세워주면 된다. first가 같다면, second를 compare혹은 compareTo를 통해 원하는 오름차순, 내림차순 정렬을 진행한다.

profile
make more services :)

0개의 댓글