sort 메소드를 통해 내림차순에 대해서 알아보다가 여기까지왔다..
- Arrays.sort(배열이름)
- Collections.sort(리스트이름)
위의 두 배열은 오름차순이 기본이다.
그런데 오름차순이 아닌 내림차순이 하고싶다면?
Comparable / Comparator
* Comparable : 기본 정렬기준을 구현하는데 사용 (ex. 오름차순 기본의 정렬 사용. sort() )
- compareTo(Object o)
* Comparator : 기본 정렬기준 외에 다른 기준으로 정렬하고자 할 때 사용 -> 내림차순 정렬 혹은 다른기준으로 정렬할 때 사용
- compare(o1, o2)
compare()과 compareTo()는 두 객체를 비교한다는 같은 기능을 목적으로 고안된 것.
: 비교하는 객체가 같으면 0, 비교하는 값보다 작으면 음수, 크면 양수를 반환하도록 구현
public interface Comparable{
public int CompareTo(Obejct o);
}
public interface Comparator{
int compare(Object o1, Object o2);
boolean equlas(Object obj);
}
- 다른 비교기준으로 사용하고 싶을때 Comparator을 implements 해서 구현해줘야한다.
- 아래에서 다시 자세하게 다룰 것
Sort
static void sort(Object[] a) // 객체 배열에 저장된 객체가 구현한 Comparable에 의한 정렬 ( 즉, 오름차순)
static void sort(Object[] a, comparator c) // 지정한 Comparator에 의한 정렬 ( 비교기준인 Comparator에 의해 정렬 )
내림차순으로 정렬하고 싶을때 Arrays.sort(strArr, new Descending()) 을 자세히 보자.
- CompareTo의 결과에 -1 을 곱하면 된다.
- 또는, c2.compareTo(c1) 과 같이 구현해도 된다.
- compare()의 매개변수가 Object 타입이기 때문에 CompareTo()를 바로 호출할 수 없으므로 먼저 Comparable로 형변환 해야 한다는것 확인.
Arrays.Sort(str);
Arrays.sort(strArr, new Descending());
class Descending implements Comparator{
public int compare(Object o1, Object o2){
if(o1 instanceof Comparable && o2 instanceof Comparable){
Comparable c1= (Comparable)o1;
Comparable c2= (Comparable)o2;
return c1.compareTo(c2) * -1;
}
return -1;
}
}
아래와 같이 람다식 이용해서 간단하게 표현 할 수도 있다.
그리고, 내림차순 사용할때 정렬 후 역순 사용하는 방법도 있다!
(이게 사실 더 편할듯,,)
Collections.sort(list);
Collecionts.reverse(list);
String 타입의 비교
📢 String 타입의 문자열들이 아래와 같을때 오름차순, 내림차순으로 정리한다면 어떻게 될까?
"3" / "100" / "11" / "30" / "22" / "2" / "34"
정답은.
오름차순 : (String) 100 < 11 < 2 < 22 < 3 < 30 < 34
내림차순 : (String) 34 > 30> 3 > 22 > 2> 11> 100
즉, String타입에서는 맨 앞자리 숫자가 작을수록 그 다음자리숫자가 작을수록 작다!
100 < 11
코드는 아래처럼 사용.
- 하지만 오름차순의 경우 굳이 compare함수를 오버라이드 할 필요없이 Arrays.sort(strArr) 로 사용하면 된다.
o1.compareTo(o2)
- 첫번째 인자가 더 크면 양수, 더 작으면 음수, 같으면 0 반환.
- o1 > o2 : 양수
- o1 < o2 : 음수
- o1 = o2 : 0
compare(o1,o2)
- 양수인 경우, o1과 o2의 순서를 바꾼다.
- 음수 또는 0 인경우, 순서를 바꾸지 않는다.
< TEST >
만약 String타입의 30과 String 타입의 34가 있는 경우,
내림차순으로 정의한 Array.sort의 compare함수를 보면.
34.compareTo(30) 인 경우, 34 가 더 크므로 양수를 반환하고.
compare함수에서 양수를 반환하므로 30과 34의 순서를 바꾼다.
https://programmers.co.kr/learn/courses/30/lessons/42746
참고하기 좋은 블로그 내용 : https://blog.naver.com/smj9030/222505348560
내림차순 관련된 알고리즘 문제를 풀어보고 싶다면 아래문제 복습
레벨 1이지만 꽤나 복잡함
https://programmers.co.kr/learn/courses/30/lessons/42889
'JAVA > JAVA 기본정리' 카테고리의 다른 글
열거형(Enums) (0) | 2022.05.30 |
---|---|
JVM의 메모리구조 (0) | 2022.05.28 |
HashMap (0) | 2022.05.09 |
ArrayList : 저장 순서가 유지되고 중복을 허용하는 컬렉션 클래스 (0) | 2022.05.08 |
컬렉션 프레임웍 / Collection인터페이스 / List / Set/ Map (0) | 2022.05.08 |