Java 공부/Java 일반

자바에서 내 마음대로 정렬하기: Comparator Overriding

모항 2022. 2. 19. 15:56

기본 데이터타입이 아닌 객체(Object)를 정렬해야 할 때가 있다.

또한, 자바에서 기본으로 제공해주는 정렬함수로는 수행하기 힘든 복잡한 방식/기준의 정렬이 필요할 때도 있다.

백준 #1931 회의실 배정 문제가 그 예시이다.

 

이럴 때 쓸 수 있는 방법은 여러 가지가 있는데, 그 중 Comparator의 compare 함수를 재정의하여 사용하는 방법을 정리해보겠다.

 

자바에 정의되어있는 Comparator를 오버라이드하여 내가 정한 기준에 따라 객체를 정렬하도록 만드는 방식이다.

어떤 새로운 형식의 객체를 정의하든지 상관 없다.

정렬의 방식과 기준도 자유롭게 정할 수 있다.

 

1차원 배열을 정렬할 때는 Arrays.sort()

List 등을 정렬할 때는 Collections.sort()를 사용한다.

 


사용법

Comparator에 포함된 함수 compare는 두 개의 객체를 매개변수로 받아서 음수 또는 양수를 리턴한다.

이걸 오버라이드해서 언제 음수를 리턴하고 언제 양수를 리턴할지 맘대로 정하면 된다.

 

오름차순 정렬

첫 번째 매개변수가 더 클 때 양수를, 두 번째 매개변수가 더 클 때 음수를 리턴하도록 오버라이드

내림차순 정렬

첫 번째 매개변수가 더 클 때 음수를, 두 번째 매개변수가 더 클 때 양수를 리턴하도록 오버라이드

 

 

예시

Comparator<Integer> cp = new Comparator<Integer>() {

			@Override
			public int compare(Integer o1, Integer o2) {
				// TODO Auto-generated method stub
				
				//수의 크기를 기준으로 오름차순 정렬
				if(o1>o2)return 1;
				else return -1;
			}
			
		};

Arrays.sort(numbers, cp);

Integer 타입의 객체를 오름차순으로 정렬하기

 

Comparator<Integer> cp = new Comparator<Integer>() {

			@Override
			public int compare(Integer o1, Integer o2) {
				// TODO Auto-generated method stub
				
				//수의 크기를 기준으로 내림차순 정렬
				if(o1<o2)return 1;
				else return -1;
			}
			
		};
        
Arrays.sort(numbers, cp);

Integer 타입의 객체를 내림차순으로 정렬하기

 

Comparator<Apple> cp = new Comparator<Apple>() {

			@Override
			public int compare(Apple o1, Apple o2) {
				// TODO Auto-generated method stub
				int size1 = o1.size;
				int size2 = o2.size;
				int sweet1 = o1.sweet;
				int sweet2 = o2.sweet;
                
				if(size1<size2) return -1;
				else if(size1 == size2){
					if(sweet1<sweet2) return -1;
					else return 1;
				}
				else return 1;
			}
			
		};
        
Arrays.sort(apples, cp);

사과를 크기 기준으로 오름차순 정렬하되, 크기가 같은 것끼리는 당도 기준으로 오름차순 정렬하기

※이때 사과(Apple)는 필드로 int size, int sweet를 갖는 객체이다.

 

 

#1181 : 단어 정렬

풀이방법 사용된 것: Comparator 오버라이딩 정렬 2022.03.26 Comparator를 오버라이딩한 후 Arrays.sort()를 사용해 정렬하면 된다. 코드 Java(2022.03.26, Comparator를 미리 정의해둔 뒤 불러내는 방법) import..

blowupmomo.tistory.com

단어를 길이순으로 정렬하되 길이가 같은 단어끼리는 사전순으로 정렬해야 하는 문제.