객체들의 특정 메소드를 가지고 ArrayList를 정렬할 수 있나요?


Comparator를 가지고 ArrayList들을 정렬할 수 있다고 알고 있습니다. 그러나 compareTo를 사용하는 모든 예제들을 보면, 그것은 문자열을 위한 메소드인 것 같이 보입니다.

저는 객체들의 특정 메소드를 가지고 ArrayList를 정렬하고 싶습니다. 예를 들면, Date 객체의 getStartDay(). 그래서 객체들의 값을 비교하기 위해서 item1.getStartDate().before(item2.getStartDate())의 로직으로 다음과 같이 구현할 수 있는지를 알고 싶습니다.:

public class CustomComparator {
    public boolean compare(Object object1, Object object2) {
        return object1.getStartDate().before(object2.getStartDate());
    }
}

public class RandomName {
    ...
    Collections.sort(Database.arrayList, new CustomComparator);
    ...
}
  • 2016년 05월 14일에 작성됨

조회수 129


1 답변


좋아요
0
싫어요
채택취소하기

Date 클래스는 Comparable 인터페이스를 구현한 서브클래스이기 때문에, Date 클래스는 String처럼 compareTo 메소드도 갖고 있습니다.

예를 들면, 아래와 같은 Comparator 클래스를 만들 수 있습니다.

public class CustomComparator implements Comparator<MyObject> {
    @Override
    public int compare(MyObject o1, MyObject o2) {
        return o1.getStartDate().compareTo(o2.getStartDate());
    }
}

compare() 메소드는boolean타입의 값이 아닌, 반드시int` 타입의 값을 반환해야 합니다.

이 Comparator를 사용해서 ArrayList를 정렬하는 것은 질문자님이 작성하신대로 하시면 되지요.

Collections.sort(Database.arrayList, new CustomComparator());

만약 특정 Comparator를 다른 곳에서 재사용하지 않는다면, 간단하게 메소드 안에서 이름이 없는 로컬 이너 클래스로 정의하시는 것도 좋습니다.

Collections.sort(Database.arrayList, new Comparator<MyObject>() {
    @Override
    public int compare(MyObject o1, MyObject o2) {
        return o1.getStartDate().compareTo(o2.getStartDate());
    }
});

Java-8 버전부터는

  1. Comparator를 위해서 간단하게 lambda expression을 사용하실 수도 있습니다.
Collections.sort(Database.arrayList, 
                        (o1, o2) -> o1.getStartDate().compareTo(o2.getStartDate()));
  1. List 클래스는 sort(Comparator) 메소드를 가지고 있기 때문에, 좀 더 간단하게 구현하실 수도 있습니다.
Database.arrayList.sort((o1, o2) -> o1.getStartDate().compareTo(o2.getStartDate()));
  1. 해당 클래스의 Comparable 키를 가지고 'Comparator'를 생성하는 기본 메소드를 사용하는 방법도 있습니다.
Database.arrayList.sort(Comparators.comparing(MyObject::getStartDate));

위의 세가지는 동일한 로직이고 동일한 결과는 보일 것입니다.

  • 2016년 05월 15일에 작성됨

로그인이 필요한 기능입니다.

Hashcode는 개발자들을 위한 무료 QnA사이트 입니다. 작성한 답변에 다른 개발자들이 댓글을 작성하거나 좋아요/싫어요를 할 수 있기 때문에 계정을 필요로 합니다.
► 로그인
► 계정만들기
Close