JAVA

Comparator를 이용한 정렬 java

signal시노 2023. 7. 23. 19:07

코딩 테스트를 볼 때 배열이나 List를 정렬해야 하는 경우가 있습니다.

이럴 때 Arrays.sort 혹은 Collections.sort를 사용합니다.

하지만 단순히 이 것은 오름차순 혹은 내림차순으로 정렬 되고 이차원 이상의 배열에서 몇 번 째 열 값을 참조해야 하는 것이 불가능 하고 이 외에도 여러가지 다소 복잡한 계산을 통해 정렬해야 하는 경우가 있습니다.

이를 해결 할 수 있는 것이 바로 Comparator입니다.

 

Comparator는 인터페이스이며 compare 메소드를 구현해야 합니다.

compare 메소드의 리턴값은 int형입니다.

다음은 Comparator 클래스의 기본형입니다.

import java.util.Comparator;
class Test implements Comparable<>{

	@Override
    public int compare(){
    	return 숫자;
    }


}

학생의 이름, 나이, 학급이 담긴 배열이 있습니다.

학생의 나이 또는 학급으로 정렬하기 위해서는 다음과 같아야 합니다.

import java.util.*;
public class TestComparator {

public static void main(String[] args) {
	
	String student [][] =new String [3][3];
	//각 행에 학생의 이름, 나이, 학급 입력
student[0][0]= "시노";
student[0][1]= "17";
student[0][2]= "3";
student[1][0]= "민지";
student[1][1]= "18";
student[1][2]= "1";
student[2][0]= "하니";
student[2][1]= "15";
student[2][2]= "2";

//나이로 오름차순 정렬
Arrays.sort(student, new Comparator<String[]>(){       //익명 클래스 생성

	@Override
	public int compare(String [] left, String [] right) {
		return Integer.valueOf(left[1])-Integer.valueOf(right[1]);
	}
	
});
for(int i=0;i<student.length;i++) {
	System.out.println("이름 : "+student[i][0]+" 나이 : "+student[i][1]+" 학급 : "+student[i][2]);
		}
	}

}


실행 결과 :
나이로 오름차순
이름 : 하니 나이 : 15 학급 : 2
이름 : 시노 나이 : 17 학급 : 3
이름 : 민지 나이 : 18 학급 : 1

두 개의 매개 변수값을 비교하는 compare 메소드에서 값의 위치 이동을 위해 편의상 left와 right로 하였습니다.

 

Array.sort를 사용하여 오름차순 정렬 이므로

compare메소드의 return 값이 음수라면 left가 왼쪽으로 이동

compare메소드의 return 값이 0이라면 그대로

compare메소드의 return 값이 양수라면 left가 오른쪽으로 이동

 

반대로 내림차순 정렬하고 싶다면 

return Integer.valueOf(right[1]- Integer.valueOf(left[1]);

두번 째 매개변수를 먼저 오게 하면 됩니다.

 

학급을 기준으로 하고 싶다면 세번 째[2] 인덱스값을 넣어야 합니다.

import java.util.*;
public class TestComparator {

public static void main(String[] args) {
	
	String student [][] =new String [3][3];
	//각 행에 학생의 이름, 나이, 학급 입력
student[0][0]= "시노";
student[0][1]= "17";
student[0][2]= "3";
student[1][0]= "민지";
student[1][1]= "18";
student[1][2]= "1";
student[2][0]= "하니";
student[2][1]= "15";
student[2][2]= "2";

//나이로 오름차순 정렬
Arrays.sort(student, new Comparator<String[]>(){       //익명 클래스 생성

	@Override
	public int compare(String [] left, String [] right) {
		return Integer.valueOf(left[2])-Integer.valueOf(right[2]);
	}
	
});
for(int i=0;i<student.length;i++) {
	System.out.println("이름 : "+student[i][0]+" 나이 : "+student[i][1]+" 학급 : "+student[i][2]);
		}
	}

}
실행결과
이름 : 민지 나이 : 18 학급 : 1
이름 : 하니 나이 : 15 학급 : 2
이름 : 시노 나이 : 17 학급 : 3

이상으로 Comparator를 이용한 정렬 방법에 대해 알아보았습니다.

return 값에 다른 조건들을 넣는다면 어려운 정렬도 충분히 쉽게 할 수 있을 것 입니다.

'JAVA' 카테고리의 다른 글

for문과 while문의 사용법  (0) 2024.07.04
startsWith 와 endsWith - java  (0) 2023.07.25
쓰레드란?  (0) 2023.07.03
JAVA/객체 지향 설계의 5가지 원칙  (0) 2023.07.02
JAVA/오버로딩과 오버라이딩  (0) 2023.06.30