갑자기 Comparator 공부 시작.
<오름차순>
현재 인스턴스(첫번째 파라미터) < 비교대상인 인스턴스 (두번째 파라미터) →→ 리턴값이 음수
현재 인스턴스 > 비교대상인 인스턴스 →→리턴값이 양수
현재 인스턴스 ==비교대상인 인스턴스 →→ 리턴값이 0
현재인스턴스(첫번째파라미터)가 작을수록 -1가 되니까.. 오름차순에서 맨앞으로 나온다?
return o1.vote - o2.vote; (오름차순 기준)
o1 < o2 ==> -1
o1 == o2 ==> 0
o1 > o2 ==> 1
인데..... (((헷갈려 -1이 앞인가.. 1이 앞인가 내림차순이랑 뒤죽박죽이라 엉켜벌임))))
예시를 들어가며 이해해보자.
Staff라는 Class를 담는 ArrayList<Staff>에 아래와 같이 데이터들이 들어가있다고 생각해보자.
이제 이 list를 각각 name , vote 기준별로 오름차순으로 해보겠다.
Idx | Name | Vote |
0 | A | 107382 |
1 | C | 18059 |
2 | B | 43265 |
3 | F | 64845 |
1. 숫자형, 정수형 오름차순 정렬하기 (1)
@Override
public int compare(Staff o1, Staff o2) {
if(o1.vote<o2.vote)
return -1;
else if (o1.vote == o2.vote)
return 0;
else
return 1;
위 코드는 vote값을 오름차순으로 정렬하는 코드이다.
staff o1, o2의 기준은 아마도 list에 저장되어있는 인덱스 순이겠지?
만일
o1.vote = 107382
o2.vote =18059 인 경우..
o1.vote > o2.vote 이기에 return 1이 된다.
o1 객체는 +1 먹었으니
뒤쪽 순서로 가겠지?
2. 숫자형, 정수형 오름차순 정렬하기 (2)
@Override
public int compare(Staff o1, Staff o2) {
return o1.vote - o2.vote;
}
위의 코드로 되어있을때는?
o1.vote - o2.vote == 107382 - 18059 == 양수 !
return 1; 이다.
앞에있는 o1이 기준이 되므로 return 1은 기준값인 o1이 +1 먹는다라고 생각하자.. (헷갈려 어려워)
3. 문자열, String 오름차순 정렬하기 (2)
@Override
public int compare(Staff o1, Staff o2) {
if(o1.name.compareTo(o2.name) < 0)
return -1;
else if (o1.name.equals(o2.name))
return 0;
else
return 1;
}
그럼 문자열 비교는 어떻게하나..? compareTo 함수를 사용한다.
아스키코드를 기반으로 비교한다.
예를들어,
o1.name = 'A'
o2.name = 'C' 면.. 왼쪽이 작기때문에 음수를 반환한다.
그럼 음수를 반환하면 return은 뭘로 해줄까?
아! o1가 작구나! ==> 오름차순이니까 return -1; 먹여줘야지! ==> -1먹고 앞으로 와라 이눔자식아!
이런 논리로... return -1;를 준다...
결론..! return 값은 기준 객체에 영향을 준다.
기준 객체는 return -1;을 많이 받을수록 앞쪽 순서로 간다...
내림차순은 조건을 반대로 하면 되겠지!
Comparator 과 Comparable의 차이는 나중에.. 오늘은 넘 피곤행
'프로그래밍 > JAVA' 카테고리의 다른 글
[Java] 문자를 index로 변환하여 관리하는 여러가지 방법 (문자 치환) (0) | 2023.12.19 |
---|---|
[JAVA] 비밀번호 암호화 하기 SHA-256 알고리즘 + Salt 적용 예제 - 레인보우 테이블 (1) | 2022.06.01 |
[JAVA][JPA] JPA Auditing으로 생성/수정 시간 자동 저장하기 (0) | 2021.01.12 |
[JAVA] ORM, JPA, Hibernate, Mybatis, SQL Mapper 용어 정리 (0) | 2021.01.10 |
[JAVA] 1차원,2차원 배열의 깊은복사, 얕은복사? (0) | 2020.03.24 |