S E P H ' S
Comparable, Comparator 본문
Comparable
- 정렬 수행 시 기본적으로 적용되는 정렬 기준이 되는 메소드를 정의하는 인터페이스
- Java에서 제공되는 정렬이 가능한 클래스들은 모두 Comparable 인터페이스를 구현하고 있고, 정렬 시에 이에 맞게 정렬이 수행된다.
- 정렬에 쓰이는 compareTo()메소드에는 하나의 파라미터가 주어진다.
- 구현 방법
- 정렬할 객체에 Comparable interface를 implements 후, compareTo()메소드를 오버라이드 하여 구현
- compareTo() 메소드 작성법
1. 현재 객체 < 파라미터로 넘어온 객체 → 음수 return
2. 현재 객체 = 파라미터로 넘어온 객체 → 0 return
3. 현재 객체 > 파라미터로 넘어온 객체 → 양수 return
4. 음수 또는 0이면 객체의 자리가 그대로 유지되고, 양수인 경우엔 두 객체의 자리가 바뀐다.
public final class Student implements Comparable<Student>{
public int no, score; // 학번, 점수
public Student(int no, int score) {
super();
this.no = no;
this.score = score;
}
@Override
public String toString() {
return "Student [no=" + no + ", score=" + score + "]";
}
@Override
// 학번순 정렬
public int compareTo(Student o) {
return this.no - o.no; // 내것에서 남의 것을 뺀다.
}
}
Student Class 에 Comparable interface를 implements 하고 comparTo 메소드로 학생의 학번 오름차순으로 정렬한 것이다.
이를 내림차순으로 정렬하고 싶다면
public int compareTo(Student o) {
return o.no - this.no; // 남의 것에서 내 것을 뺀다
}
파라미터로 전달된 것에서 자신의 것을 빼면 내림차순으로 정렬된다.
Comparator
- 이 인터페이스를 구현한 클래스는 정렬 규칙 그 자체를 의미하고, 기본 정렬 규칙과 다르게 원하는대로 정렬 순서를 지정하고 싶을 때 사용한다.
- 비교 대상의 두 원소가 아닌 별도의 도우미 역할
- 정렬에 쓰이는 compare() 메소드에는 두 개의 파라미터가 주어진다.
- 구현방법
- 별도의 규칙을 가진 클래스를 생성하고 Comparator를 구현하고 compare() 메소드를 구현한다.
- Comparable의 compareTo() 메소드와는 다르게 파라미터를 두 개를 받는다.
static class StudentComparator implements Comparator<Student>{
@Override
public int compare(Student o1, Student o2) {
return o2.no - o1.no;
}
}
Comparator Class를 별도로 만들어서 학번 내림차순을 한 코드이다.
Arrays.sort(students, new Comparator<Student>() {
@Override
public int compare(Student o1, Student o2) {
return o1.score - o2.score; // 점수 오름차순 정렬하고 출력
}
});
Arrays.sort()를 수행하면서 sort의 인자로 바로 Comparator를 구현하여 사용하는 것도 가능하다.
Arrays.sort(students, (o1, o2) -> {
if ( o2.score == o1.score) return o1.no - o2.no;
return o2.score - o1.score;
});
System.out.println("5"+Arrays.toString(students));
람다식을 사용하여 점수 내림차순 정렬을 하는데 만약 점수가 같다면 학번의 오름차순으로 정렬을 해준 결과이다.
- 사용방법
- Arrays.sort(array);
- Collections.sort(list);
Comparable과 Comparator 의 차이
Comparable - 이 인터페이스를 구현한 객체 스스로에게 부여하는 한 가지 기본 정렬 규칙을 설정하는 목적으로 사용
Comparator - 이 인터페이스를 구현한 클래스는 정렬 규칙 그 자체를 의미하며, 기본 정렬 규칙과는 다르게 원하는대로 정렬 순서를 지정하고 싶을 때 사용한다.
Arrays.sort() 와 Collections.sort()의 차이
Arrays.sort() - 배열 정렬
Collections.sort() - 클래스의 객체 정렬
JAVA의 오름차순 기준 - 숫자 > 대문자 > 소문자 > 한글
● Arrays.sort()
public class ArraysSortTest {
public static void main(String[] args) {
String[] arr = { "1", "a", "3", "가", "A"};
System.out.println("원본 : " + Arrays.toString(arr));
Arrays.sort(arr);
System.out.println("오름차순 정렬 : "+ Arrays.toString(arr));
Arrays.sort(arr, Collections.reverseOrder());
System.out.println("내림차순 정렬 : "+ Arrays.toString(arr));
}
}
● Collections.sort()
public class CollectionsSortTest {
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<String>();
list.add("5");
list.add("A");
list.add("가");
list.add("3");
list.add("b");
System.out.print("원본 : ");
for (int i = 0; i < list.size(); i++) {
System.out.print(list.get(i) + " ");
}
System.out.println();
Collections.sort(list);
System.out.print("오름차순 정렬 : ");
for (int i = 0; i < list.size(); i++) {
System.out.print(list.get(i) + " ");
}
System.out.println();
Collections.reverse(list);
System.out.print("내림차순 정렬 : ");
for (int i = 0; i < list.size(); i++) {
System.out.print(list.get(i) + " ");
}
}
}
'Programing & Coding > JAVA' 카테고리의 다른 글
[Java] 2. 자바 가상 머신 (JVM) (0) | 2021.12.17 |
---|---|
[Java] 1. Java, 왜 사용할까? (0) | 2021.12.17 |
JAVA Exception 처리 방식 (0) | 2021.02.21 |
JAVA Exception (0) | 2021.02.21 |
변수의 초기 값(Default Values) (0) | 2021.02.21 |