[Java] Comparator 이용한 ArrayList 정렬하기 - return 값의 양수/0/음수 의미, Java 오름차순 정렬 예제 :: 매운코딩
728x90
300x250

갑자기 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의 차이는 나중에.. 오늘은 넘 피곤행

 

 

 

 

 

참고  : https://hianna.tistory.com/569 

728x90

+ Recent posts