사용자 ID 별 합계 및 리스트를 사용이 필요하게 되어 작성..
기존 PHP에 다중배열(맵)로 처리되어 있는 방식을
Java 로 변환하려하다보니 찾아보게 되었으며, 정리하게 됨.
우선 PHP 소스..
$idList = array(); 블라블라~ $data[$id][] = array( 'amt' => $amt );
$data 라는 맵에 id를 키로 한 다중배열을 가지고 있는 형태이다.
$id 는 $idList에서 관리하고 있다.
현재 운영중인 PHP 화면
위 화면에서 처럼 사용자별 요약 값과 각 리스트가 존재하는 형태.
이것을 Java로 변환하려다보니..
HashMap 과 ArrayList 를 병행하여 사용하게 되었다.
ArrayList<ReportVO> reportList = reportService.getReportList(pMap); HashMap<String, ArrayList<ReportVO>> reportMap = new HashMap<String, ArrayList<ReportVO>>(); ArrayList<String> idList = new ArrayList<String>(); String beforeId = ""; String usrId = ""; for (ReportVO reportVO : reportList) { usrId = reportVO.getUsrId(); if(!beforeId.equals(usrId)) { beforeId = usrId; idList.add(usrId); if(reportMap.containsKey(usrId)) { reportMap.get(usrId).add(reportVO); }else { reportMap.put(usrId, new ArrayList<ReportVO>()); reportMap.get(usrId).add(reportVO); } } }
그리고 해당 ID에 해당하는 HashMap인 reportMap 에 처음 조회한
reportList 객체 reportVO를 담아준다.
이후 출력
<c:forEach items="${idList}" var="id"> <c:forEach items="${reportMap[id]}" var="reportVO"> <tr> <td rowspan="${fn:length(reportMap[id])}"> ${reportVO.usrId} </td> </tr> </c:forEach> </c:forEach>
위와 같이 ID 리스트를 기준으로
각 아이디가 가지고 있는 reportVO 리스트를 반복하여 조회하여 준다.
여기서 내가 몰랐던 사실은 맵에 있는 값을 가져오기 위하여
객체.변수명 으로 사용하려고 했던 부분..
사용자 아이디가 예를 들어 TEST 라고 한다면
${reportMap.TEST} 로 사용하기 위하여
${reportMap.${id}} 후
<c:forEach items=”${reportMap.${id}}”> 와 같이 사용…하는 등..
(작동하지 않음-_- 오류 뱉어 냅니다.)
<c:set> 태그를 이용하여
<c:set var=”temp”>reportMap.${id}</c:set>
${temp.usrId}
(작동하지 않음 오류 뱉어내요..ㅠㅠ)
정상작동
${reportMap[id]}
(정상작동합니다.)
맵에서 리스트를 조회 할때에는 위와 같이 PHP에서 문자열을 키로 사용하듯이 사용하니..
정상 작동한다.