Step-by-Step
Comparable & Comparator 사용하기 본문
옛날에 포스팅한 적 있었는데,,, 옛날이라 이해가 많이 부족한게 보였다.
그래서 다시 작성한 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 값
- 기준값.compareTo(비교값);
- 기준값 - 비교값;
- 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