객체들의 특정 메소드를 가지고 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 답변
-
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
버전부터는Comparator
를 위해서 간단하게 lambda expression을 사용하실 수도 있습니다.
Collections.sort(Database.arrayList, (o1, o2) -> o1.getStartDate().compareTo(o2.getStartDate()));
List
클래스는sort(Comparator)
메소드를 가지고 있기 때문에, 좀 더 간단하게 구현하실 수도 있습니다.
Database.arrayList.sort((o1, o2) -> o1.getStartDate().compareTo(o2.getStartDate()));
- 해당 클래스의
Comparable
키를 가지고 'Comparator'를 생성하는 기본 메소드를 사용하는 방법도 있습니다.
Database.arrayList.sort(Comparators.comparing(MyObject::getStartDate));
위의 세가지는 동일한 로직이고 동일한 결과는 보일 것입니다.
댓글 입력