본문 바로가기
PROGRAM/JAVA / JSP

List<Map> 정렬방법

by ojava 2018. 8. 7.
반응형

목록 반환을 위해 자주 사용되는 List, Map 그리고 그 둘을 합친 List<Map>

 

많은 데이터를 화면에 한 번에 보여주기 위해서 List<Map>을 통해 데이터를 전달하고 싶은데

또 그 와중에 정렬해야 하는 기준이 생겼다면 어떻게 해야할까?

 

Servlet에서 DB 또는 그 외의 데이터 통신방식을 통해 데이터를 넘겨받아서

화면에 던져줄 List 값을 만든다고 가정했을 때 정렬하는 방식이 여러가지 있을 수 있다.

 

 

 

첫 번째. 가장 좋은 방법인 DB에서 정렬한 상태로 받아온다.

 

우리에겐 쿼리가 있다. order by가 있는데 내가 정렬을 해 줄 필요가 없다.

하지만 내가 쿼리를 변경할 수 없는 경우

데이터를 가공되지 않은 상태로 받아와야 하는 경우 등 우리를 난감하게 하는 상황은 늘 있다.

 

 

두 번째. 화면에서 정렬하는 방식이다.

 

대표적으로 JSTL을 사용해서 반복문으로 뿌려줄 때 로직을 걸거나

레이아웃에 따라 여러가지의 방법이 있을 수 있겠지만

대표적으로 자주 사용되어지는 c tag의 forEach문을 생각해보자면

begin, end, step, varStatus 등의 변수를 가지고 반복문을 어떻게 뿌려줄 지 구성해주는데

만약 정렬해야 할 대상이 순차적인 값을 가지고 있지 않다면?

SEQ 값이 뒤죽박죽이라면?

 

그럴 때는 다른 방식으로 정렬해야 한다.


 

마지막. 화면에 뿌려줄 데이터를 java단에서 정렬해서 넘기는 방식이다.

 

로직으로 구성하게 되면 더더욱 다양한 방식이 있을테지만

오늘 소개하고 싶은 방식은 Collections.sort 함수를 이용하는 형태이다.


내가 정렬하고자 하는 기준을 세워서 활용하는 방식으로, 

1) 정렬 기준이 많거나

2) 재사용성이 좋기 때문에 정렬해야 하는 대상이 많을 경우에 사용한다. 

 


Collections.sort 함수의 경우 두 가지 형태로 정의되어 있다. 


public static <T extends Comparable<? super T>> void sort(List<T> list)

정렬하고자 하는 list만 인자값으로 넘기면 되는 방식.

이 때 Generic Type으로 선언된 T의 경우 Comparable을 구현한 형태여야 한다.

String, Integer 등은 일반적으로 Comparable을 구현했으므로 위의 형태로 바로 사용이 가능하다.




public static <T> void sort(List<T> list, Comparator<? super T> c)

정렬하고자 하는 list값과 정렬의 기준이 되는 Comparator 객체값을 같이 넘겨주는 방식.  

Comparable이 구현되지 않은 클래스를 사용하거나 개인이 정의한 클래스를 사용하는 경우에 해당된다.

List<Map> 정렬방식을 사용하려는 나의 경우도 여기에 해당된다.




Comparator 클래스 정의 예시

 

public class sortMember implements Comparator<Map<String, Object>> {

 

@override

public int compare(Map<String, Object> a, Map<String, Object> b) {

 

int aSeq = Integer.parseInt(a.get("SEQ").toString());

int bSeq = Integer.parseInt(b.get("SEQ").toString());

 

// a가 필수이면서 b가 필수가 아니면 a부터 정렬

if (a.get("MUST").eqauls("O") && !b.get("SEQ").toString()) {

return -1;

// a가 필수가 아니고 b가 필수이면 b부터 정렬

} else if (!a.get("MUST").eqauls("O") && b.get("SEQ").toString()) {

return 1;

} else {

// 둘 다 필수가 아닌 경우, 각자의 seq 번호 순으로 정렬

return aSeq - bSeq;

}

}

}



 

위와 같이 각자의 기준에 맞는 Comparator 클래스를 구현하면 된다.

본인의 경우 List<Map>을 구성하는 Map 내부적으로 정렬에 필요한 MUST 값과 SEQ 값이 있다고 보고

이 기준을 적용하여 정렬용 클래스를 구현하였다.

필수값을 우선으로 정렬하고 필수가 아닌 경우는 SEQ 값 순서대로 정렬한다.

 


이런 기준을 적용하여 구현한 클래스로 값을 정렬해보자.

 

 

List<Map<String, Object>> resultList = getListData(); // List<Map> 목록을 가져오는 부분

 

// 정렬할 List<Map>과 이를 정렬할 기준을 선언한 클래스 객체

Collections.sort(resultList, new sortMember());

 

위와 같은 방법으로 본인만의 기준으로 정렬해서 원하는 결과를 얻으시길!


 

 


 

블로그에 포스팅하는 대부분의 내용은 고민하던 문제 해결 방법을 찾았을 때나

자주 사용하지만 까먹는 내용 등을 기록해두기 위해 사용하는 것이므로

미래의 나와 또 다른 누군가에게도 이런 문제가 생겼을 때 도움이 되기를 바란다.

 

 

 

출처

Oracle java docs : https://docs.oracle.com/javase/7/docs/api/java/lang/Comparable.html

반응형