본문 바로가기
JAVA BASE/Collection(컬렉션) - 자료구조

15. [자바] Comparator와 Comparable

by staticClass 2021. 1. 6.

정렬?

Comparable 기본 정렬기준을 구현하는데 사용.
Comparator 기본 정렬기준 외에 다른 기준으로 정렬하고자 할 때 사용

Comparable(오름차순 정렬)

정렬을 할때 Arrays.sort()를 호출하면 알아서 정렬이 되는것처럼 보이지만.

Character클래스의 Comparable 인터페이스의 구현에 의해 정렬된다.

기본적으로 오름차순 으로 정렬되도록 구현되어 있다.

String[] strArr = {"cat", "Dog", "lion", "tiger"};

Arrays.sort(strArr); // String의 Comparable구현에 의한 정렬
System.out.println("strArr = " + Arrays.toString(strArr));
strArr = [Dog, cat, lion, tiger]

 

Comparator(기타 기준 정렬)

Comparable을 구현한 클래스들은 기본적으로 오름차순으로 정렬되어 있다

만약 내림차순이나 다른 기준에 의해 정렬되게 하고 싶다면

Comparator를 구현해서 정렬기준을 제공하면 된다

꼭 구현을 하지 않아도 이미 구현되어 있는 기능들도 있다.

String[] strArr = {"cat", "Dog", "lion", "tiger"};

Arrays.sort(strArr, String.CASE_INSENSITIVE_ORDER); // 대소문자 구분 안함
System.out.println("strArr = " + Arrays.toString(strArr));

Arrays.sort(strArr, Comparator.reverseOrder()); // 역순으로 정렬함
System.out.println("strArr = " + Arrays.toString(strArr));
strArr = [cat, Dog, lion, tiger]
strArr = [tiger, lion, cat, Dog]
종류 설명
Comparator.naturalOrder() 오름 차순으로 정렬(작은 값에서 큰 값으로)
Comparator.reverseOrder() 내림 차순으로 정렬(큰값에서 작은 순으로)
String.CASE_INSENSITIVE_ORDER 대소문자 구분 안하고 오름 차순으로 정렬

 

 

Collections.sort(list, new ValueComparator());
static class ValueComparator implements Comparator{
	@Override
	public int compare(Object o1, Object o2) {
		if(o1 instanceof Map.Entry && o2 instanceof Map.Entry) {
			Map.Entry e1 = (Map.Entry)o1;
			Map.Entry e2 = (Map.Entry)o2;
			
			int v1 = ((Integer)e1.getValue());
			int v2 = ((Integer)e2.getValue());
			
			return v2 - v1;
		}
		return -1;
	}
}

 

댓글