오늘도 평화로운 개발중
흐으으으음...
아무튼 개발중
문의내역 게시판을 개발하고 있는데
게시글 목록을 불러와서 작성일 기준으로 보여줘야하는데
뭐 쿼리에서 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]
작동 방식
- 기본 정렬:
- 리스트 요소들이 Comparable 인터페이스를 구현하고 있어야 합니다.
- 예를 들어, Integer, String은 기본적으로 Comparable을 구현하며, 기본 순서(숫자는 크기, 문자열은 사전순)로 정렬됩니다.
- 사용자 정의 정렬:
- 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
}
});
아래 코드의 작동 방식은 이런데
- o1과 o2의 날짜 값 추출:
- frstRegistPnttm 키의 값을 가져옵니다.
- String date1 = (String) o1.get("frstRegistPnttm");
- 예: "2024-11-13"과 "2024-11-18".
- String.compareTo 사용:
- date2.compareTo(date1)은 두 문자열을 비교합니다.
- 문자열 비교는 ISO 8601 형식(예: "YYYY-MM-DD")일 때, 사전식 비교와 동일하게 날짜 비교로 동작합니다.
- date2.compareTo(date1)은 내림차순(최신 날짜 우선)으로 정렬.
- 결과:
- 반환값:
- 양수: date2가 date1보다 더 최신일 때.
- 0: 두 값이 같을 때.
- 음수: date2가 date1보다 더 오래된 날짜일 때.
- Collections.sort는 이 결과를 이용해 리스트를 정렬
- 반환값:
그래서 결과를 확인해 보니
작성일 기준으로 정렬이 잘 나오고 있다
아주 굿
'개발이야기' 카테고리의 다른 글
GROUP BY 와 MAX 를 이용한 LEFT OUTER JOIN 데이터 중복 제거 (2) | 2024.11.27 |
---|---|
JavaScript Code-Refactoring(코드 리펙토링) 을 해보자 (1) | 2024.11.20 |
Dart 다트 입문기 다트 언어 기본 알아보기 [4] -제어문 (2) | 2024.11.02 |
Dart 다트 입문기 다트 언어 기본 알아보기 [3] -연산자 (3) | 2024.11.02 |
Dart 다트 입문기 다트 언어 기본 알아보기 [5] -함수와 람다 (0) | 2024.11.02 |