개발이야기

자바 정렬 Collections.sort 이용한 날짜 정렬

나는안울어 2024. 11. 18. 16:27

 

오늘도 평화로운 개발중

 

 

흐으으으음...

 

아무튼 개발중

 

문의내역 게시판을 개발하고 있는데

 

게시글 목록을 불러와서 작성일 기준으로 보여줘야하는데

 

뭐 쿼리에서 ORDER BY 해주면 되겠지 했는데

 

어라? 게시판 글을 불러오는 테이블이 2개인상황이고 

 

각각 리스트를 불러와서 하나의 리스트에 합쳐서 화면에 보여줘야 하는 상황인데

 

if(commandMap.get("clsf").equals("ALL") || commandMap.get("clsf").equals("")) {

	qnaList = boardService.gridArticleListByMyPageQna(boardVO);
	prdInquiryList = productDataInqOfferService.selectMyPageProductDataInqOfferList(commandMap);
}else if(commandMap.get("clsf").equals("AU")) {
	qnaList = boardService.gridArticleListByMyPageQna(boardVO);
}else if(commandMap.get("clsf").equals("DU")){
	prdInquiryList = productDataInqOfferService.selectMyPageProductDataInqOfferList(commandMap);
}
        
List<Map<String, Object>> result = new ArrayList<>();
        
result.addAll((Collection<? extends Map<String, Object>>) qnaList);
result.addAll((Collection<? extends Map<String, Object>>) prdInquiryList);



이러면 ORDER BY 가 각자 되기 때문에 의미가 없는 상황

 

그래서 result 에 합쳐 준 뒤에 다시 정렬 하기로 했다

 

어떻게 하면 좀 쉽게 할 수 있을까 찾아 봤는데

 

JAVA 에서 제공하는 메서드가 있어서 써보기로 했다

 

내가 사용한 메서드는 Collection.sort

 

이건 List 컬렉션을 정렬하는데 사용되는 메서드 이다

 

기본 정의

Collection.sort 는 두 가지 형태로 제공

 

1. 기본 정렬(자연순서)

 

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

 

  • 매개변수
    • list : 정렬에 사용한 리스트
  • 요구사항
    • 리스트의 요소는 Comparable 인터페이스를 구현해야 하며, compareTo 메서드를 통해 정렬 기준을 정의해야 한다
  • 사용 예
List<Integer> numbers = Arrays.asList(5, 3, 8, 1);
Collections.sort(numbers); // 오름차순 정렬
System.out.println(numbers); // [1, 3, 5, 8]

 

2. 사용자 정의 정렬

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

 

  • 매개변수
    • list : 정렬에 사용할 리스트
    • c : Comparator 객체로, 사용자 정의 정렬 기준을 제공
  • 사용 예
List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
Collections.sort(names, (a, b) -> b.compareTo(a)); // 내림차순 정렬
System.out.println(names); // [Charlie, Bob, Alice]

 

 

작동 방식

  1. 기본 정렬:
    • 리스트 요소들이 Comparable 인터페이스를 구현하고 있어야 합니다.
    • 예를 들어, Integer, String은 기본적으로 Comparable을 구현하며, 기본 순서(숫자는 크기, 문자열은 사전순)로 정렬됩니다.
  2. 사용자 정의 정렬:
    • Comparator 인터페이스를 구현하거나 람다식으로 정렬 기준을 제공합니다.
    • 예를 들어, 날짜, 객체의 특정 속성 등을 기준으로 정렬할 수 있습니다.

 

위 문제를 사용자 정의 정렬을 통해 해결했는데

 

Collections.sort(result, new Comparator<Map<String, Object>>() {
    @Override
    public int compare(Map<String, Object> o1, Map<String, Object> o2) {
        String date1 = (String) o1.get("frstRegistPnttm");
        String date2 = (String) o2.get("frstRegistPnttm");

        // Compare strings as ISO 8601 date-time
        return date2.compareTo(date1); // Descending order
    }
});

 

 

아래 코드의 작동 방식은 이런데

 

  1. o1과 o2의 날짜 값 추출:
    • frstRegistPnttm 키의 값을 가져옵니다.
    • String date1 = (String) o1.get("frstRegistPnttm");
    • 예: "2024-11-13"과 "2024-11-18".
  2. String.compareTo 사용:
    • date2.compareTo(date1)은 두 문자열을 비교합니다.
    • 문자열 비교는 ISO 8601 형식(예: "YYYY-MM-DD")일 때, 사전식 비교와 동일하게 날짜 비교로 동작합니다.
    • date2.compareTo(date1)은 내림차순(최신 날짜 우선)으로 정렬.
  3. 결과:
    • 반환값:
      • 양수: date2가 date1보다 더 최신일 때.
      • 0: 두 값이 같을 때.
      • 음수: date2가 date1보다 더 오래된 날짜일 때.
    • Collections.sort는 이 결과를 이용해 리스트를 정렬

 

그래서 결과를 확인해 보니

 

 

작성일 기준으로 정렬이 잘 나오고 있다

 

아주 굿