티스토리 뷰

Comparable Interface

  • 클래스의 기본 정렬 기준을 설정하는 인터페이스
  • Comparable Interface의 compareTo() 메소드를 구현하여 정렬의 기준이 되는 메소드를 정의하여 사용한다
  • 정렬 가능한 클래스들로 Arrays.sort() 호출 시 실행되는 함수가 바로 Comparable Interface에 기본으로 오름차순으로 정의되어 있는 compareTo() 메소드이다!
  • 하지만 특정 클래스 타입의 객체는 정렬 기준을 따로 정해줘야하기 때문에 해당 클래스에서 Comparable Interface를 상속받아 compareTo() 메소드를 override하여 정렬의 기준이 되는 메소드를 정의해줘야 한다

사용 방법

  • 정렬하고자 하는 객체의 클래스에 Comparable Interface를 상속받아 compareTo()를 구현해주었다
  • Integer.compare(a, b)는 현재 객체와 비교하고자 하는 객체를 오름차순으로 정렬해주는 함수이다
    • a < b 일 경우 -> 음수 리턴 (자리 유지)
    • a == b 일 경우 -> 0 리턴 (자리 유지)
    • a > b 일 경우 -> 양수 리턴 (자리 바꿈)
class Student implements Comparable<Student> {
	String name;
	int id;
	public Student(String name, int id){
		this.name = name;
		this.id = id;
	}
	public String print(){
		return "이름 : "+name+", 학번: "+id;
	}
	
    	// 학번을 기준으로 오름차순 정렬 
	public int compareTo(Student compareStydent) {
		return Integer.compare(id, compareStydent.id);
	}

public class ComparableTest{
	public static void main(String[] args) {
    
		Student student[] = new Student[4];
		student[0] = new Student("김예진", 20161091);
		student[1] = new Student("양시연", 20173922);
		student[2] = new Student("김찬영", 20146037);
		student[3] = new Student("최예원", 20209384);
		
		Arrays.sort(student);
		for(int i=0;i<4;i++)
			System.out.println(student[i].print());
    }
}
  • 내림차순으로 정렬하고 싶다면 아래와 같이 매개변수의 순서를 바꿔주면 된다
// 내림차순 정렬
public int compareTo(Student compareStydent) {
	return Integer.compare(compareStydent.id, id);
}
  • Integer.compare()의 리턴타입을 이해했다면 다음과 같이 함수를 간략하게 할 수 있다
// 오름차순 정렬
public int compareTo(Student compareStudent) {
	return this.id - compareStudent.id;
}

// 내림차순
public int compareTo(Student compareStudent) {
	return compareStudent.id - id;
}

 

Comparator Interface

  • 알고리즘을 풀다보면 오름차순, 내림차순뿐만 아니라 새로운 기준으로 정렬을 해야할 때가 있다
  • 정렬하고자 하는 객체의 클래스를 직접 수정할 수 없을 때, 또는 이미 정의된 정렬 기준과는 다른 새로운 기준으로 객체를 정의하고 싶을 때  Comparator를 사용하면 특정한 정렬의 기준을 세워 객체를 나열할 수 있다!
  • Comparator Interface 구현체를 정의한 후 sort() 함수의 매개변수로 함께 넘기거나 익명클래스를 이용하여 사용한다

사용 방법

  • 먼저 정렬을 원하는 객체 타입의 comparator 객체를 구현한 후, Arrays.sort()의 두번째 파라미터로 넘겨주었다
  • Integer.compare() 함수를 사용하였기 때문에 나이 오름차순으로 정렬되어 출력된다
  • 밑의 코드에서 김예진 학생과 양시연 학생의 나이가 같은데, 이렇게 정렬기준 값이 같은 경우는 배열에 있는 순서대로 정렬된다
class Student{
	String name;
	int id;
	int age;
	public Student(String name, int id, int age){
		this.name = name;
		this.id = id;
		this.age = age;
	}
	public String print(){
		return "이름 : "+name+", 학번: "+id+", 나이 : "+age;
	}
}

public class ComparatorTest{
	public static void main(String[] args) {
    
		Student student[] = new Student[4];
		student[0] = new Student("김예진", 20161091, 24);
		student[1] = new Student("양시연", 20173922, 24);
		student[2] = new Student("김찬영", 20146037, 26);
		student[3] = new Student("최예원", 20209384, 20);
		
		Comparator<Student> comparator = new Comparator<Student>(){
			public int compare(Student s1, Student s2) {
				return Integer.compare(s1.age, s2.age); // 나이 오름차순 정렬
			}
		};
		
		Arrays.sort(student, comparator);
		
		for(int i=0;i<4;i++)
			System.out.println(student[i].print());
	}
}
  • comparator 객체를 구현하지 않고 Arrays.sort() 함수 호출 시 익명 클래스를 만들어 바로 사용할 수 있다
  • 밑의 경우에는 기본적으로 나이는 내림차순으로 정렬하고, 나이가 같은 경우에는 학번 오름차순으로 정렬했다
Arrays.sort(student, new Comparator<Student>(){
	public int compare(Student s1, Student s2) {
		if(s1.age == s2.age){ // 나이가 같은 경우
			return Integer.compare(s1.id, s2.id); // 학번 오름차순으로 정렬
		}
	return Integer.compare(s2.age, s1.age); // 나이는 내림차순으로 정렬
	}
});
  • 만약 분기없이 한가지 기준으로 간단하게 정렬하고자 한다면 람다 함수를 이용해 코드를 간략화 할 수 있다
// 나이 내림차순 정렬
Arrays.sort(student, (s1,s2) -> Integer.compare(s2.age, s1.age));

사용 예제

  • 밑의 예제는 배열로 주어지는 숫자들을 이어붙혀 가장 큰 수를 만들어야하는 문제의 코드이다
  • 우리가 String 클래스의 정렬 기준을 수정할 수 없기 때문에 Comparator를 사용해야 한다
  • 단어를 이어붙혀 넘기는 매개 변수를 기준으로 내림차순으로 정렬해야 한다
  • "6"과 "10"을 예시로 들면 "106".compareTo("610") 이므로, 음수가 리턴되어 자리가 유지된다
  • 다음으로 "10"과 "2"를 비교하면 "210".compareTo("102") 이므로 양수가 리턴되어 자리가 바뀌게 된다
  • 결과적으로 매개변수 기준 내림차순으로 정렬된 [6, 2, 10]가 출력되게 된다
String[] strNum = {"6", "10", "2"};

Arrays.sort(strNum, new Comparator<String>() {
	@Override
	public int compare(String o1, String o2) {
		return (o2+o1).compareTo(o1+o2);
	}		
});

 

🕊compareTo의 반환값을 생각하기 어려울 때 참고하면 좋은 링크

 

[JAVA] 자바_compareTo ( 값 [문자열/숫자] 비교 )

compareTo() - int compareTo(NumberSubClass referenceName) - int compareTo(String anotherString) - compareTo() 함수는 두개의 값을 비교하여 int 값으로 반환해주는 함수이다. compareTo() 함수에는 위에서..

mine-it-record.tistory.com

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함