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

조회수 2329회

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);
    ...
}

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));
    

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

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)