티스토리 뷰

반응형

 

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
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함