본문 바로가기

프로그래밍/Java

Comparator의 동작방식

반응형

학습목표

어제 프로그래머스의 '가장 큰 수' 알고리즘을 풀고, 포스팅을 하면서 Compare와 Comparator 그리고 String의 대소비교에 대해서 명확히 알고자 포스팅을 했다. 그런데 마지막 실습코드 디버깅중에 이상한 현상이 발견되었다. Comparator의 compare(Objecjt o1, Object o2)의 설명에는 o1은 첫번째로 비교하는 파라미터, o2가 두번째로 비교하는 파라미터라고 되어있다. 나는 당연히 o1과 o2는 배열의 순서대로 들어올줄 알았다. 그러나 arr[n]과 arr[n+1]을 비교할때마다 o1 = arr[n+1]이 할당되고, o2 = arr[n]이 할당되는 것을 디버깅을 하면서 알게되었다. 도대체 왜그럴까?.... compare는 에초에 Comparator 인터페이스에 '선언'만 되어있어, 구현은 내가 한게 다이다. 영문을 몰라 오랜시간 검색해봤지만 찾지 못했었다. 그러나 퇴근하면 잠깐 검색해본 게시글에서 답을 찾았다. 명확히 짚고 머릿속에 새겨두도록 하자

Comparator는 오름차순 정렬이다.

먼저 어제의 디버깅 결과를 보도록하자.

배열의 순서는 6,10,2로 되어있으나, var1에는 6이 아니라 10이, var2에 10이 아닌 6이 할당되어있다.

Parameters: o1 - the first object to be compared. o2 - the second object to be compared.

분명 description에서도 var1엔 첫번째 비교값이, var2에 두번째 비교값이 할당된다고 적혀있는데 왜?...

그 이유는 Comparator의 기본정렬이 '오름차순'임을 생각하면 알수있다.

o1과 o2를 비교했을때, compare의 값이 1(양수)이 나오면 두 수의 자리를 swap() 한다.

그러므로 o1에 arr[n]이 할당되고, o2에 arr[n+1]이 할당되면 o1이 현재 배열의 순서상 앞서있음에도 swap을 하게된다. 그렇기 때문에 o1에는 arr[n+1]이, o2에 arr[n]이 할당되는 것이다.

Feedback

오름차순... 과 더불어 swap()을 compare의 값이 1(양수)가 나올때만 한다는것을 알았다. 그전까지는.... 전혀 몰랐다. 왜였지?... 실제 코드를 봤을때는 워낙 복잡해서.... 명확히 확인은 못했지만, 기본적으로 오름차순일때는 compare의 값이 1(양수)일때 swap() 된다는걸 기억하자!

알게 된 점

  • 오름차순 정렬시 swap()은 양수일때 수행된다.

알아야 할점

  • [ ] swap()을 하는 실제 코드 확인

References

Java 객체 정렬하기: Comparable과 Comparator

 

Java 객체 정렬하기: Comparable과 Comparator

대부분의 프로그래밍 언어에서 기본적으로 제공하는 sort 함수를 사용하면 일반적인 숫자나 문자열이 들어있는 배열을 정렬하는 것은 쉽다. 하지만 여러 속성이 들어있는 '객체' 들이 들어있는

gsmesie692.tistory.com

프로그래머스 베스트앨범 Java + Collection Sort와 Comparator 정리

 

프로그래머스 베스트앨범 Java + Collection Sort와 Comparator 정리

해시를 잘 사용하여서 풀면 되는 문제였으나 문제를 꼬아놔서 Java로 풀면 Map과 Collection의 특징을 잘 활용하지 못하면 풀지 못하는 문제였습니다. 알고리즘 적으로 어려운 문제는 아니지만 Map과

andonekwon.tistory.com

 

반응형

'프로그래밍 > Java' 카테고리의 다른 글

Dynamic Proxy 직접 구현해보기-2  (0) 2021.08.10
Dynamic Proxy직접 구현해보기-1  (0) 2021.08.10
Comparator VS Comparable  (0) 2021.07.26
정적 언어와 동적언어 그리고 덕 타이핑  (0) 2021.07.22
서블릿  (1) 2021.07.12