본문 바로가기
프로그래밍/Java

Java List 사용자 정의 정렬 예제

by Mr-후 2023. 6. 29.
반응형
    @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에서는 그래도 비교적 쉽게 정렬을 쓸 수 있으나, 자바는 직접 이렇게 손수 한땀한땀 코딩을 요하는구만... 

 

 

 

반응형