달력

32024  이전 다음

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31

'Programming'에 해당되는 글 1건

  1. 2018.09.06 Listmap<String,Object>값(value)으로 비교정렬하기

쿼리문에서 sort로 정렬됐음에도 불구하고 LIST 맵에 담았을때 순서가 뒤죽박죽일 경우가 있다.

Map에는 순서가 없어 뒤죽박죽으로 나오는경우가 생긴다고 한다.

여기에서 한가지 알아둬야 하는것은 Treemap으로 정렬은 key값으로만 자동정렬 가능하다.

즉, Value(값)으로는 정렬이 안된다.


​Value값으로 정렬은 Collections.sort 를 이용해 비교하여 정렬해봤다.

아래 부분이 쿼리에서는 sort가 정확히 되어지지만 map에 담았을 경우에는 순서가 뒤죽박죽이 되었다.

List<Map<String, Object>> articleList = articleService.list(params);

그래서 정렬하기 위한 Collections.sort 를 하였다.

//쿼리에서 가져온 articleList의 값을 다시 정렬

Collections.sort(articleList, orderSort);

//정렬하기 위한 orderSort 부분

private final static Comparator<Map<String,Object>> orderSort = new Comparator<Map<String,Object>>() {
        private final Collator collator = Collator.getInstance();
        @Override
        public int compare(Map<String, Object> values1, Map<String, Object> values2) {
       return collator.compare(String.valueOf(values1.get("num")),  String.valueOf(values2.get("num")));
        }
    };

위와같이 저렇게 하면 비교가 된다.

하지만, ​

Collections.sort 는 String값만 비교할 수 있으므로,

num끼리 비교할때 문제가 생기게 되었다.

​1부터 15의 num 순서를 정렬해야 한다면

String으로 비교하니 순서가

​1,10,11,12,13,14,15,2,3,4,5,6,7,8,9

이렇게 나오게 되었다.

내가 정렬하고 싶었던건 num의 값이 1부터 15까지 순서대로 나오는거였는데...

그래서 고민결과,

String인 값 앞부분에  "0"을 붙여주기로 하였다.


01,02,03,04,05,06,07,08,09,010,011,012,013,014,015 로 비교하면 제대로 나올테니..

String 숫자비교때문에 수정한 소스 내용

//정렬하기 위한 orderSort 부분

private final static Comparator<Map<String,Object>> orderSort = new Comparator<Map<String,Object>>() {
        private final Collator collator = Collator.getInstance();
        @Override
        public int compare(Map<String, Object> values1, Map<String, Object> values2) {
       String str = String.format("%03d", Integer.parseInt(String.valueOf(values1.get("num"))));
       String str1 = String.format("%03d", Integer.parseInt(String.valueOf(values2.get("num"))));
            return collator.compare(str,  str1);
        }
    };

포맷팅에서 %3d는 3자리, %2d 2자리 라고 한다. 난 3자리로 만들꺼니까 %3d로 변경해서 서로 비교하니

값이 제대로 1부터 15까지 정렬되서 잘 나왔다.

해당부분은 검색하면 사람들이 올려놓은 블로그에 잘 나왔는데, 혹여나 게시판을 만들다 저와같은 상황이 나타날수도 있는 분들을 위해 다시 정리해봤다.

 

Posted by 푸른길땡
|