JAVA/JAVA 기본정리

Comparator/ Comparable / Sort / 내림차순

hyun-1200 2022. 5. 17. 19:09

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

 

코딩테스트 연습 - 가장 큰 수

0 또는 양의 정수가 주어졌을 때, 정수를 이어 붙여 만들 수 있는 가장 큰 수를 알아내 주세요. 예를 들어, 주어진 정수가 [6, 10, 2]라면 [6102, 6210, 1062, 1026, 2610, 2106]를 만들 수 있고, 이중 가장 큰

programmers.co.kr

 

 


 

 

참고하기 좋은 블로그 내용 : https://blog.naver.com/smj9030/222505348560

 

Arrays.sort() / Collections.sort()

Arrays.sort() 1. 배열 정렬 1) 오름차순 Arrays.sort()를 사용하면 오름차순으로 배열이 정렬된다. 2) ...

blog.naver.com

 

 


내림차순 관련된 알고리즘 문제를 풀어보고 싶다면  아래문제 복습 

레벨 1이지만 꽤나 복잡함 

 

https://programmers.co.kr/learn/courses/30/lessons/42889

 

코딩테스트 연습 - 실패율

실패율 슈퍼 게임 개발자 오렐리는 큰 고민에 빠졌다. 그녀가 만든 프랜즈 오천성이 대성공을 거뒀지만, 요즘 신규 사용자의 수가 급감한 것이다. 원인은 신규 사용자와 기존 사용자 사이에 스

programmers.co.kr