S E P H ' S

Comparable, Comparator 본문

Programing & Coding/JAVA

Comparable, Comparator

yoseph0310 2021. 2. 21. 20:26

Comparable

- 정렬 수행 시 기본적으로 적용되는 정렬 기준이 되는 메소드를 정의하는 인터페이스

- Java에서 제공되는 정렬이 가능한 클래스들은 모두 Comparable 인터페이스를 구현하고 있고, 정렬 시에 이에 맞게 정렬이 수행된다.

- 정렬에 쓰이는 compareTo()메소드에는 하나의 파라미터가 주어진다.

 

- 구현 방법

  - 정렬할 객체에 Comparable interface를 implements 후, compareTo()메소드를 오버라이드 하여 구현

  - compareTo() 메소드 작성법

     1. 현재 객체 < 파라미터로 넘어온 객체 → 음수 return

     2. 현재 객체 = 파라미터로 넘어온 객체 → 0 return

     3. 현재 객체 > 파라미터로 넘어온 객체 → 양수 return

     4. 음수 또는 0이면 객체의 자리가 그대로 유지되고, 양수인 경우엔 두 객체의 자리가 바뀐다.

 

public final class Student implements Comparable<Student>{
	public int no, score; // 학번, 점수

	public Student(int no, int score) {
		super();
		this.no = no;
		this.score = score;
	}

	@Override
	public String toString() {
		return "Student [no=" + no + ", score=" + score + "]";
	}

	@Override
	// 학번순 정렬
	public int compareTo(Student o) {
		return this.no - o.no;	// 내것에서 남의 것을 뺀다.
	}
	
}

Student Class 에 Comparable interface를 implements 하고 comparTo 메소드로 학생의 학번 오름차순으로 정렬한 것이다.

실행결과 1

이를 내림차순으로 정렬하고 싶다면

public int compareTo(Student o) {
		return o.no - this.no;	// 남의 것에서 내 것을 뺀다
	}

파라미터로 전달된 것에서 자신의 것을 빼면 내림차순으로 정렬된다.

실행결과 2

 

Comparator

- 이 인터페이스를 구현한 클래스는 정렬 규칙 그 자체를 의미하고, 기본 정렬 규칙과 다르게 원하는대로 정렬 순서를 지정하고 싶을 때 사용한다.

- 비교 대상의 두 원소가 아닌 별도의 도우미 역할

- 정렬에 쓰이는 compare() 메소드에는 두 개의 파라미터가 주어진다.

 

- 구현방법 

  - 별도의 규칙을 가진 클래스를 생성하고 Comparator를 구현하고 compare() 메소드를 구현한다. 

  - Comparable의 compareTo() 메소드와는 다르게 파라미터를 두 개를 받는다.

 

static class StudentComparator implements Comparator<Student>{

		@Override
		public int compare(Student o1, Student o2) {
			return o2.no - o1.no;
		}
		
	}

실행결과 3

Comparator Class를 별도로 만들어서 학번 내림차순을 한 코드이다.

 

 

Arrays.sort(students, new Comparator<Student>() {

			@Override
			public int compare(Student o1, Student o2) {
				return o1.score - o2.score;	// 점수 오름차순 정렬하고 출력
			}
			
		});

실행결과 4

Arrays.sort()를 수행하면서 sort의 인자로 바로 Comparator를 구현하여 사용하는 것도 가능하다.

Arrays.sort(students, (o1, o2) -> {
			if ( o2.score == o1.score) return o1.no - o2.no;
			return o2.score - o1.score;
		});
		System.out.println("5"+Arrays.toString(students));

실행결과 5

람다식을 사용하여 점수 내림차순 정렬을 하는데 만약 점수가 같다면 학번의 오름차순으로 정렬을 해준 결과이다.

 

- 사용방법

  - Arrays.sort(array);

  - Collections.sort(list);

 

Comparable과 Comparator 의 차이

Comparable - 이 인터페이스를 구현한 객체 스스로에게 부여하는 한 가지 기본 정렬 규칙을 설정하는 목적으로 사용

Comparator - 이 인터페이스를 구현한 클래스는 정렬 규칙 그 자체를 의미하며, 기본 정렬 규칙과는 다르게 원하는대로 정렬 순서를 지정하고 싶을 때 사용한다.

 

 

Arrays.sort() 와 Collections.sort()의 차이

Arrays.sort() - 배열 정렬

Collections.sort() - 클래스의 객체 정렬

 

JAVA의 오름차순 기준 - 숫자 > 대문자 > 소문자 > 한글

 

● Arrays.sort()

public class ArraysSortTest {

	public static void main(String[] args) {
		 String[] arr = { "1", "a", "3", "가", "A"};
		 
		 System.out.println("원본 : " + Arrays.toString(arr));		 
		 Arrays.sort(arr);
		 System.out.println("오름차순 정렬 : "+ Arrays.toString(arr));
		 Arrays.sort(arr, Collections.reverseOrder());
		 System.out.println("내림차순 정렬 : "+ Arrays.toString(arr));
		 
	}

}

 

● Collections.sort()

public class CollectionsSortTest {

	public static void main(String[] args) {
		ArrayList<String> list = new ArrayList<String>();
		list.add("5");
		list.add("A");
		list.add("가");
		list.add("3");
		list.add("b");
		
		System.out.print("원본 : ");
		for (int i = 0; i < list.size(); i++) {
			System.out.print(list.get(i) + " ");
		}
		System.out.println();
		
		Collections.sort(list);
		System.out.print("오름차순 정렬 : ");
		for (int i = 0; i < list.size(); i++) {
			System.out.print(list.get(i) + " ");
		}
		System.out.println();
		
		Collections.reverse(list);
		System.out.print("내림차순 정렬 : ");
		for (int i = 0; i < list.size(); i++) {
			System.out.print(list.get(i) + " ");
		}
		
	}

}

 

 

'Programing & Coding > JAVA' 카테고리의 다른 글

[Java] 2. 자바 가상 머신 (JVM)  (0) 2021.12.17
[Java] 1. Java, 왜 사용할까?  (0) 2021.12.17
JAVA Exception 처리 방식  (0) 2021.02.21
JAVA Exception  (0) 2021.02.21
변수의 초기 값(Default Values)  (0) 2021.02.21