티스토리 뷰
ArrayList 를 정렬하는데는 Collections.sort() 메소드를 사용한다. 이 sort() 메소드의 인자로 정렬할 리스트를 넘기게 되는데, 오버로딩된 두 가지 버전의 메소드가 있다.
Comparable : 객체 간의 일반적인 정렬이 필요할 때, Comparable 인터페이스를 확장해서 정렬의 기준을 정의하는 compareTo(Object o) 메서드를 구현한다.
=> 한 가지 기본 정렬 규칙을 설정(클래스에 규칙을 하나 정해놓고 누군가 정렬하라고 한다면 그 객체는 규칙대로 정렬을 수행)
Comparator : 객체 간의 특정한 정렬이 필요할 때, Comparator 인터페이스를 확장해서 특정 기준을 정의하는 compare(Object o1, Object o2) 메서드를 구현한다. (두개의 인자 받음)
=> 객체의 정렬 기준을 정의 하고 싶은데 정렬 대상 클래스의 코드를 직접 수정할 수 없는 경우,
기본정렬규칙 외에 별도의 정렬규칙을 정의해 사용하고 싶을 때 이용
[Main]
[Comparable 사용]
compareTo에는 두가지 방법이 있는데, 둘 다 상관 없다. (위의 방법의 경우 낮은 확률로 int의 범위를 초과할 수 있다고 함)
"Returns a negative integer, zero, or a positive integer as this object is less
than, equal to, or greater than the specified object." 라 API에 적혀 있지만 greater than the specified object만 하여도 compare이 가능하다.
( return this.year-m.year)
내부 sort 구현은 QuickSort로 되어있을 것으로 예상.
* m.year - this.year =>년도 최신 순 부터
this.year - m.year =>년도 오래된 순
* if(this.year>m.year){return 1;}
=> 년도 오래된 순 부터 출력
if(this.year< m.year){return 1;}
=> 년도 최신 순 부터 출력
[Comparator 사용]
Comparator 인터페이스의 구현체를 Arrays.sort(), Collections.sort()와 같은 정렬 메서드의 추가 인자로 넘기면 정렬 기준을 누락된 클래스의 객체나 기존 정렬 기준을 무시하고 새로운 정렬 기준으로 객체를 정렬할 수 있습니다.
*변수가 double 일경우, 위의 방식대로 하면 compare이 가능 하다.
*if(m1.getRating()>m2.getRating()){return 1}
=> 평점(Rating) 낮은순 먼저 출력
*if(m1.getRating()<m2.getRating()){return 1}
=> 평점(Rating) 높은순 먼저 출력
[Comparator - Age]
* m2.getAge()-m1.getAge() => age 높은순
m1.getAge()-m2.getAge() => age 낮은순
혹은 return o1.getAge().compareTo(o2.getAge()) 도 가능
[결과]
*반대로 정렬시
=> 1) return값 부호 변경 2) 오름 차순으로 정렬 -> Collections.reverse() 메소드를 사용
* 람다 함수로 대체 가능
* The sort() method uses polymorphism by passing any object that is Comparable.
Q. Quick Sort로 확인
Q. 람다 함수란?
Q. 다형성이란? Sort()에서 다형성이 어디에 쓰이는가
출처: https://offbyone.tistory.com/154 ,https://jeong-pro.tistory.com/173 ,https://dev-daddy.tistory.com/23, https://www.javaworld.com/article/3323403/java-challengers-5-sorting-with-comparable-and-comparator-in-java.html,https://cwondev.tistory.com/15 ,https://www.daleseo.com/java-comparable-comparator/, https://www.geeksforgeeks.org/comparable-vs-comparator-in-java/
'JAVA' 카테고리의 다른 글
[JAVA] 객체지향설계 5원칙 - SOLID (0) | 2022.11.07 |
---|---|
[JAVA] Stream (0) | 2022.09.14 |
향상된 For 문(+ArrayList에서 index 가져오기) (0) | 2020.01.06 |
객체 배열이란(클래스를 배열로 선언하기) (0) | 2020.01.03 |
StringTokenizer (0) | 2020.01.03 |