Comparable과 Comparator

업데이트:


Comparable

Comparable은 인터페이스이다. 이 인터페이스에는 객체를 정렬하는 데 사용되는 메소드인 compareTo() 메서드를 정의하고 있기 때문에 사용자 정의 클래스에서는 이 메서드를 오버라이딩하여 사용한다.

  • 리턴 타입 : int
  • 메서드 : compareTo(T o)
  • 주어진 객체와 같으면 0, 적으면 음수, 크면 양수를 리턴한다.
  • Collections.sort()와 함께 써야 정렬이 완료된다.
  • 기본적으로 오름차순 정렬이며, 내림차순을 원한다면 compareTo() 로직을 반대로 변경하면 된다.


// Comparable 구현 클래스

public class Person implements Comparable<Person>{
	public String name;
	public int age;
	public int height;
	
	public Person(String name, int age, int height) {
		this.name = name;
		this.age = age;
		this.height = height;
	}
	
	@Override
	public int compareTo(Person o) { // 정렬 기준 : 나이
		if(age < o.age)return -1;
		else if(age == o.age) return 0;
		else return 1;
	}

	@Override
	public String toString() {
		return name + ", " + age + ", " + height;
	}
}
import java.util.ArrayList;
import java.util.Collections;

public class PsersonRun {
	public static void main(String[] args) {
		ArrayList<Person> list = new ArrayList<>();
		
		list.add(new Person("고길동", 43, 170));
		list.add(new Person("이선희", 38, 167));
		list.add(new Person("조선우", 23, 165));
		list.add(new Person("이한솔", 28, 168));
		
		Collections.sort(list);
		for(Person p : list) {
			System.out.println(p);
		}
	}
}


실행 결과
결과1

나이 순으로 정렬이 된 걸 확인할 수 있다. 만약 나이가 아니라 키 순서대로 정렬하고 싶으면 Compareble 구현 클래스 내 compareTo() 메서드 내부 if문 조건을 변경해주면 된다.

// 정렬 기준 : 키
@Override
public int compareTo(Person o) {
    if(height < o.height)return -1;
    else if(height == o.height) return 0;
    else return 1;
}


실행 결과

결과2

compareTo() 메서드의 경우는 문자열은 정렬할 수 없고, 비교만 가능하다.






Comparator

Comparator 인터페이스도 객체를 정렬하는 데 사용되는 인터페이스이다. Comparator 인터페이스를 구현하면 오름차순 이외의 기준으로도 정렬할 수 있다. Comparator는 compare() 메서드를 재정의하여 사용한다.

  • 리턴 타입 : int
  • 메서드 : compare(T o1, T o2)
  • 비교하는 두 객체가 동등하면 0, 비교하는 값보다 앞에 오게 하려면 음수, 뒤에 오게 하려면 양수를 리턴


[프로그래머스] 문자열 내 마음대로 정렬

import java.util.Arrays;
import java.util.Comparator;

public class compareSort {
	public static String[] solution(String[] strings, int n) {
		Arrays.sort(strings, new Comparator<String>() {
			@Override
			public int compare(String o1, String o2) {
				if(o1.charAt(n) > o2.charAt(n)) return 1;
				else if(o1.charAt(n) == o2.charAt(n)) return o1.compareTo(o2);
				else return -1;
			}
		});
		return strings;
	}
	
	public static void main(String[] args) {
		System.out.println(Arrays.toString(solution(new String[] {"abce", "abde", "cdx"}, 1)));
	}
}

실행 결과

결과3

태그:

카테고리:

업데이트:

댓글남기기