자바에서는 배열,리스트를 정렬하기 위해 Comparable,Comparator라는 두가지 인터페이스를 제공한다.
Comparable - 이 인터페이스를 구현한 객체 스스로에게 부여하는 한 가지 기본 정렬 규칙을 설정하는 목적으로 사용한다.(보통 작은수에서 큰수로, 알파벳 순서대로, 가나다 순서대로 정렬한다.)
Comparator - 이 인터페이스를 구현한 클래스는 정렬 규칙 그 자체를 의미하며, 기본 정렬 규칙과 다르게 원하는대로 정렬순서를 지정하고 싶을 때 사용한다.
배열의 경우 정렬을 할 때 Arrays 클래스의 sort()메서드를 이용하여 정렬한다.
int,String값은 오름차순 정렬이 잘 되지만, 객체를 만들고 나서, sort()를 쓰면
java.lang.ClassCastException: 객체이름 cannot be cast to java.lang.Comparable
에러가 나온다. Comparable에서 객체를 캐스팅할 수가 없다는 오류이다.
그 때, Comparable의 compareTo()메소드를 오버라이딩해서 내가 원하는 순서대로 정렬을 커스텀할 수 있다.
class Car implements Comparable<Car>{
private String name;
private int price;
public Friend(String name, int price) {
super();
this.name = name;
this.age = price;
}
@Override
public int compareTo(Car o) {
return this.price - o.price; //가격 내림차순
}
}
public static void main(String[] args) {
Car car01 = new Car("아반떼", 3000);
Car car02 = new Car("소나타", 2000);
System.out.println(car01.compareTo(car02));
}
위 코드는 Car라는 객체의 가격 내림차순으로 정렬해서 보여준다. Car클래스가 Comparable인터페이스를 implements받아 compareTo메소드를 오버라이드해서 가격 내림차 순으로 설정해주었다.
List의 경우는 Arrays가 아니라 Collections의 sort()메소드를 이용하여 정렬한다.
class Car implements Comparable<Car>{
private String name;
private int price;
public Friend(String name, int price) {
super();
this.name = name;
this.age = price;
}
}
class SortCarByNameInAsc implements Comparator<Car>{
@Override
public int compare(Car c1,Car c2){
return c2.name.compareTo(c1.name)
}
}
public static void main(String[] args) {
Car car01 = new Car("아반떼", 3000);
Car car02 = new Car("소나타", 2000);
List<Car> list = new ArrayList<Car>();
list.add(car01);
list.add(car02);
Collections.sort(list, new SortCarByNameInAsc());
System.out.println(list.get(0)+","+list.get(01));
}
위 코드에서는 SortCarByNameInAsc라는 클래스를 Comparator 인터페이스를 implements받아 compare메소드를 오버라이드해서 정렬할 방법을 설정해주었다. compare는 비교할 두 개의 매개변수가 필요하다.
'Java' 카테고리의 다른 글
[JAVA]컬렉션(Collection) (0) | 2020.06.05 |
---|
댓글