Step-by-Step

Comparable & Comparator 사용하기 본문

언어/JAVA

Comparable & Comparator 사용하기

희주(KHJ) 2022. 11. 13. 22:52

옛날에 포스팅한 적 있었는데,,, 옛날이라 이해가 많이 부족한게 보였다.

그래서 다시 작성한 Comparable Comparator!

 

 

List 같은 곳에 요소들을 넣을 때, 매번 비교하고 넣으면 코드가 너무 지저분해진다.

그럴때 사용하는거 Comparable & Comparator!

 

 

Comparable

  • 객체 간 비교를 가능하게 해주는 인터페이스   (→사용시 구현해야 함)
  • 구현한 클래스는 반드시 compareTo(T o) 메소드를 정의해야 함

 

compareTo(T o)

  • T : 객체 타입
  • 내가 만든 특정 기준으로 정렬하고 싶다!! compareTo 메소드 이용하자

 

 

 

하지만! 글자만 보면 뭔소린지 모르니까 밑에 예제를 보자

 

 

Student 클래스

class Student {
	String name;		// 이름
	int sNum;		// 학번
    
    public Student(String name, int sNum){
    	this.name = name;
        this.sNum = sNum;
    }
}

- String 타입 이름int 타입 학번을 필드로 갖는 Student class가 있다.

 

 

Comparable 구현 1) 이름 순 정렬

class Student implements Comparable<Student>{
	String name;		// 이름
	int sNum;		// 학번
	    
	public Student(String name, int sNum){
	this.name = name;
	this.sNum = sNum;
	}
	    
	@Override
	public int compareTo(Student o) {
		return this.name.compareTo(o.name);
	}
}

- 나는 이름(사전)순으로 정렬하고 싶어 compareTo를 이용했다.

- this는 현재 객체 / 파라미터 o는 비교 대상 객체이다.

 

 

Comparable 구현 2) 학번 순 정렬

class Student implements Comparable<Student>{
	String name;		// 이름
	int sNum;		// 학번
	    
	public Student(String name, int sNum){
	this.name = name;
	this.sNum = sNum;
	}
	    
	@Override
	public int compareTo(Student o) {
		return this.sNum - o.sNum;
	}
}

- 학번이 작은 순서대로 정렬하는 코드이다.

- 현객체의 학번에서 비교대상객체의 학번을 빼주면된다.

 

 

※ Return 값

  1. 기준값.compareTo(비교값);
  2. 기준값 - 비교값;
  • 0 : 기준값이 비교값과 같다 
  • 1 : 기준값이 비교값보다 크다
  • -1 : 기준값이 비교값보다 작다

 

기준값현재 객체(this)로 잡으면 오름차순비교값현재 객체(this)로 삼으면 내림차순으로 생각하면 쉽다!

 

 

 

구현하고 사용 방법 예시는 다음과 같다.

 

 

Student 객체 생성

Student st1 = new Student("홍길동", 1);
Student st2 = new Student("김삿갓", 4);
Student st3 = new Student("김삿갓", 2);
Student st4 = new Student("김삿갓", 3);

네 학생 객체를 생성하였다.

 

 

 

Student Class

class Student implements Comparable<Student>{
		String name;		// 이름
		int sNum;		// 학번
	    
	    public Student(String name, int sNum){
	    	this.name = name;
	        this.sNum = sNum;
	    }
	    
	    @Override
		public int compareTo(Student o) {
	    	if(this.name == o.name) {
	    		return o.sNum - this.sNum;
	    	}
			return this.name.compareTo(o.name);
		}
	}

1. 이름 사전 순으로 정렬

2. 만약 이름이 같다면 학번이 큰 순서대로 정렬

 

 

List에 넣고 Sort


ArrayList<Student> arr = new ArrayList<>();
arr.add(st1);
arr.add(st2);
arr.add(st3);
arr.add(st4);
		
System.out.println("====정렬전====");
for(Student s : arr)
	System.out.print(s.name+" "+s.sNum+"\n");

Collections.sort(arr);
	
System.out.println("====정렬후====");
for(Student s : arr)
	System.out.print(s.name+" "+s.sNum+"\n");

 

**결과**

 

 


Comparator 


 

Comparator은 class 구현말고, 익명 클래스와 람다식으로 간단히 정리하겠다.

 

익명 클래스

Collections.sort(arr, new Comparator<Student>() {

	@Override
	public int compare(Student s1, Student s2) {
	   	if(s1.name == s2.name) {
	   		return s2.sNum - s1.sNum;
		}
		return s1.name.compareTo(s2.name);
	}
			
});

- compare(객체 1, 객체 2)로 두 객체를 비교한다.

 

 

람다식 버전(Lamda)

Collections.sort(arr, (Student s1, Student s2)-> (s1.sNum - s2.Num));

- 다른 경우의 수를 추가할 수 있는지는 모르겠다. 조금 찾아봤는데, 람다식 예제가 많이 없는듯.

 

 

 

 

 

인터페이스 구현한 객체를 PriorityQueue 우선순위 큐에 넣으면 자동으로 비교 메소드 참조한다. 그냥 넣으면 됨~!

 

'언어 > JAVA' 카테고리의 다른 글

[Java] 백준7579 - 앱  (0) 2022.11.14
[Java] 프로그래머스 - 베스트앨범 (+Comparable 사용)  (0) 2022.11.13
[Java] 백준11758 - CCW  (0) 2022.11.12
[Java] 백준9376 - 탈옥  (1) 2022.11.12
[Java] 백준15683 - 감시  (0) 2022.10.20
Comments