[Java] Comparable와 Comparator

정현명·2022년 2월 16일
0

Java

목록 보기
2/5

[Java] Comparable와 Comparator


1. Comparable과 Comparator의 목적

객체를 사용자가 정의한 정렬 기준에 맞춰 정렬해야 할 경우

ex)

  • 이차원 배열에서 0 인덱스에 오름차순, 1 인덱스에 내림차순할 때
  • Student 클래스 내의 여러 멤버변수 중 특정 변수를 오름차순(내림차순)할 때


2. Interface Comparable

  • Java에서 제공되는 정렬이 가능한 모든 클래스는 Comparable 인터페이스를 가지고 있다

    • java.lang.Comparable
    • Integer, Double ⇒ 오름차순 정렬
    • String ⇒ 사전순 정렬
  • compareTo()

    • Comparator 인터페이스는 compareTo() 라는 하나의 메소드를 가지고 이 메소드를 정렬할 객체에 오버라이드하여 정렬 방법을 커스터마이징 할 수 있다
    • compareTo()는 매개변수로 현재 객체와 같은 타입의 객체를 받아서 정렬하고 싶은 특정 값을 서로 비교하여 -1, 0, 1 을 반환한다
    • 현재 객체 < 파라미터 객체 : 음수 리턴
    • 현재 객체 == 파라미터 객체 : 0 리턴
    • 현재 객체 > 파라미터 객체 : 양수 리턴 (양수일 경우 두 객체의 위치를 바꾼다)
  • Comparable를 이용한 객체 정렬

class Student implements Comparable<Student> {
	int age;
	int id;
	String name;

	Student(int age, int id, String name){
		super();
		this.age = age;
		this.id = id;
		this.name = name;
	}

	// age에 대해 오름차순, age가 같으면 id에 대해 내림차순 하기
	@Override
	public int compareTo(Student s){
		return (this.age-s.age==0) ? s.id - this.id : this.age - s.age;
	}
}

// main  
List<Student> students = new ArrayList<>();
students.add(20,1,"kim");
students.add(20,3,"jung");
students.add(20,2,"lee");
students.add(21,4,"bang");

Collections.sort(students);


3. Interface Comparator

  • 정렬 가능한 클래스들의 기본 정렬 기준과 다르게 정렬 하고 싶을 때 사용하는 인터페이스

    • java.util.Comparator
  • compare()

    • Comparator interface는 compare() 메소드 하나를 가지고 있어 이를 오버라이드한다
    • compare()는 매개변수로 같은 타입의 두 객체를 받아 정렬하고 싶은 특정 값을 서로 비교하여 -1, 0, 1을 반환한다
    • 1번 객체 < 2번 객체 : 음수 리턴
    • 1번 객체 == 2번 객체 : 0 리턴
    • 1번 객체 > 2번 객체 : 양수 리턴 (양수일 경우 두 객체의 위치를 바꾼다)
  • Comparator를 이용한 객체 정렬

class Student {
	int age;
	int id;
	String name;

	Student(int age, int id, String name){
		super();
		this.age = age;
		this.id = id;
		this.name = name;
	}
}

class MyComparator implements Comparator<Student>{
	// age에 대해 오름차순, age가 같으면 id에 대해 내림차순 하기
	@Override
	public int compare(Student s1, Student s2){
		return (s1.age-s2.age==0) ? s2.id - s1.id : s1.age - s2.age;
	}
}

List<Student> students = new ArrayList<>();
students.add(20,1,"kim");
students.add(20,3,"jung");
students.add(20,2,"lee");
students.add(21,4,"bang");

MyComparator mc = new MyComparator();
Collections.sort(students, mc);
profile
꾸준함, 책임감

0개의 댓글