@Override
public int compareTo(ShowMainResBody o) {
if (o.seq < seq) {
return 1;
} else if (o.seq > seq) {
return -1;
}
return 0;
}
몇 몇의 개발자가 스쳐 지나가면서 소스는많이 닳고 변해 버렸다.
따라가면서 읽기도 힘들고, 뭐가 뭔지도 모르겠고...
이걸 한땀 한땀 리팩토링을 하면서 작성자의 의도를 읽어, 정정해야하는가? 나둬야 하는가를 가지고
동료한 이야기 한 후, 그냥 두기로 했다.
리스트 형태로 결과를 내려줘야 하는 API에, 초기 설계 당시 없던 order by에 대한 다양한 요건이 들어왔고
가장 빠르게 해결할 수 있는 방법은, 그간에 어떤 일들이 있던 없던 제일 마지막에 만들어진 List<T>형태에서
사용자의 임맛대로 배열(리스트)를 정렬시키는 예제.
1. 배열에 담길 객체의 선언
public class ShowMainResBody implements Serializable, Comparable<ShowMainResBody> {
implements로 Serializable과 Comparble<ShowMainResBody>를 구현한다고 정의되어 있다. (여기까진, 앞선 개발자가 해두심 ㅎ)
저렇게 선언하게 되면 반드시 @Override해야 하는 메서드가 있다.
@Override
public int compareTo(ShowMainResBody o) {
if (o.seq < seq) {
return 1;
} else if (o.seq > seq) {
return -1;
}
return 0;
}
이렇게 되면 ShowMainResBody의 seq프로퍼티로만 정렬이 가능하기 때문에, 별도로 사용자 정의 정렬을 위한 클래스를 생성한다.
seq로 정렬하고 싶으면 마지막에 리턴하기 전에 아래와 같이 호출해주면 된다. ^^
Collections.sort(showMainResList);
나의 경우, 프로젝트 이름과, 마지막 업데이트 날짜로 정렬을 DESC, ASC해야 하기에 다음 두 클래스를 추가했다.
public class ProjectNameComparator implements Comparator<ShowMainResBody> {
@Override
public int compare(ShowMainResBody o1, ShowMainResBody o2) {
return o1.getName().compareTo(o2.getName());
}
}
public class ProjectUpdateDateComparator implements Comparator<ShowMainResBody> {
@Override
public int compare(ShowMainResBody o1, ShowMainResBody o2) {
if (o1.getLastUpdate().isAfter(o2.getLastUpdate())) {
return 1;
} else if (o1.getLastUpdate().isBefore(o2.getLastUpdate())) {
return -1;
}
return 0;
}
}
그리고 설정된 정렬 값에 따라 가장 마지막 리턴하기 전에 배열(리스트)의 정렬을 변경한다.
//사용자정의의 sort정렬
if (user.getSortBy().equals("setting,none")) {
Collections.sort(showMainResList);
} else if (user.getSortBy().equals("name,des")) {
Collections.sort(showMainResList, new ProjectNameComparator().reversed());
} else if (user.getSortBy().equals("name,asc")) {
Collections.sort(showMainResList, new ProjectNameComparator());
} else if (user.getSortBy().equals("lastUpdate,des")) {
Collections.sort(showMainResList, new ProjectUpdateDateComparator().reversed());
} else if (user.getSortBy().equals("lastUpdate,asc")) {
Collections.sort(showMainResList, new ProjectUpdateDateComparator());
} else {
Collections.sort(showMainResList);
}
여러 클래스를 만드는 것이 신경쓰였으나 그나마 , reversed()가 있어서 좋다.
조금만 더 귀찮아즘이 높았다면 리팩토링 한다고 소스 다 떧었을 것 같다. 인터넷 검색해서 sorting하는걸 찾았기 망정이지..
objective-c나 swfit에서는 그래도 비교적 쉽게 정렬을 쓸 수 있으나, 자바는 직접 이렇게 손수 한땀한땀 코딩을 요하는구만...
'프로그래밍 > Java' 카테고리의 다른 글
오픈JDK설치 정보 (0) | 2024.07.04 |
---|---|
자바의정석 도서 구입 과정에 대한 이야기. (0) | 2023.07.30 |
Java Long 타입의 비교 에피소드? (0) | 2023.02.02 |
Java 매달, 첫번째 월요일 확인 예제 (0) | 2020.06.29 |
Java Calendar를 이용한 두 날짜의 차이 계산 (0) | 2019.05.15 |