- 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; // 오름차순
}
}
}
'공부 > Java' 카테고리의 다른 글
[Java] 자바 배열 복사하기 (0) | 2023.01.12 |
---|---|
[Java]자바의 정렬 라이브러리 Arrays.sort() / Collections.sort() / List.sort() 비교 정리 (0) | 2023.01.05 |
[Java]Java의 시간 다루기 (0) | 2022.09.04 |
[Java] DFS/BFS 탐색 알고리즘 (0) | 2022.02.08 |
[Java]파일 읽기 (0) | 2022.01.18 |
댓글