在实际项目中,经常会遇到在jsp页面中(一遍是列表展现页面)展现后台传递过来的List中的场景。
前几天遇到一个比较复杂一点的,涉及到前台JSP列表页面首先遍历后台传递的List,然后List中的每个元素作为另一个Map中的Key,在遍历中,需要根据List中的元素作为key,获取后台Map中的value值,然后本身Map中的Value值又是一个List。
简要描述下场景,原始数据截图如下:
需求:统计表格中出现频次最多的辩证(证型),然后在相应的辩证下再统计频次最多的中药。
设计思路:辩证(证型)频次统计比较简单,直接List倒序即可(需要List中保存的对象实现Comparable接口),前台页面循环List即可。该辩证(证型)下的中药频次统计比较复杂,考虑到需要在JSP中遍历List之后根据List中的元素取得对应频次统计,则使用Map。
后台组装代码如下:
///证型频次分析:在把证型统计出来之后,在连接着这个证型,在这个证型的下面能不能再根据这一个证型下面的用药频次再做一个统计分析
zhengMingAnalyseList = bingLiService.getZhengMingAnalyseList(new ZhengMingAnalyse());
List<BingLiChuFangAnalyse> bingLiChuFangAnalyseList = null;
// /*******创建一个map结构,key是证型,value是该证型下用药最多的前10种List<中药,频数>*****/
// HashMap<ZhengMingAnalyse,List<ZhongYaoAnalyse>> zhengMingZhongYaoCountMap = new HashMap<ZhengMingAnalyse,List<ZhongYaoAnalyse>>();
///循环频数前10的证型,查找出这些证型下所有的处方
for (ZhengMingAnalyse zhengMingAnalyse : zhengMingAnalyseList) {
///这里的bingLiChuFangAnalyseList是该证型下所有的处方,SQL中直接控制存储在chufang字段
bingLiChuFangAnalyseList = bingLiService.getZhengMingChuFangAnalyseList(zhengMingAnalyse);
///先使用map,利用key的不重复性统计该证型下中药的频次
HashMap<String,Integer> zhongYaoCountMap = new HashMap<String,Integer>();
for (BingLiChuFangAnalyse bingLiChuFangAnalyse : bingLiChuFangAnalyseList) {
///这里过滤掉非中药名的汉字:(单包)、(冲服)
String chufang = bingLiChuFangAnalyse.getChufang().replaceAll("(单包)", "").replaceAll("(冲服)", "").replaceAll("(包)", "");
String[] chufangArr = chufang.split(",");
for (int i = 0; i < chufangArr.length; i++) {
///因为使用","分割的中药名格式是:青陈皮各9g 或者 怀牛膝12,需要抓取出单纯的汉字中药名
String zhongYaoName = FilterStrUtil.getChinese(chufangArr[i]);
if(null != zhongYaoName && !"".equals(zhongYaoName)){
if(zhongYaoCountMap.containsKey(zhongYaoName)){
int count = zhongYaoCountMap.get(zhongYaoName);
count = count + 1;///出现一次,频数加1。
zhongYaoCountMap.put(zhongYaoName, count);
}else{
zhongYaoCountMap.put(zhongYaoName, 1);
}
}
}
}
///走到这里,Map:zhongYaoCountMap中已经保存了该证型下所有的中药频数,此时需要将map转成list,方便排序
List<ZhongYaoAnalyse> zhongYaoCountList = new ArrayList<ZhongYaoAnalyse>();
Iterator it = zhongYaoCountMap.keySet().iterator();
while (it.hasNext()) {
String key = it.next().toString();
zhongYaoCountList.add(new ZhongYaoAnalyse(key,zhongYaoCountMap.get(key)));
}
Collections.sort(zhongYaoCountList);///针对zhongYaoCountList排序。
///将最终的结果保存到zhengMingZhongYaoCountMap对象传递到前台
////创建一个map结构,key是证型,value是该证型下用药最多的前10种List<中药,频数>*****/
////HashMap<ZhengMingAnalyse,List<ZhongYaoAnalyse>> zhengMingZhongYaoCountMap = new HashMap<ZhengMingAnalyse,List<ZhongYaoAnalyse>>();
zhengMingZhongYaoCountMap.put(zhengMingAnalyse, zhongYaoCountList);
}
break;
传递到前台的有两个集合对象:zhengMingAnalyseList和zhengMingZhongYaoCountMap。
前台JSP展现代码:
<%@ page language="java" pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<%@ include file="/base.jsp"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>
<body>
<table width="100%" class="sTable" >
<tr class="tHead tCenter">
<td class="sTd" width="3%" style="display:none">
<input type="checkbox" id="checkFlag" name="checkFlag" onclick="checkAll();" title="全选" />
</td>
<td width="20%" nowrap="nowrap">证型</td>
<td width="10%" nowrap="nowrap">频数统计(次)</td>
<td width="67%" nowrap="nowrap" align="left">该证型下中药频数统计(次)</td>
<td style="display:none">ID</td>
</tr>
<% int count =0;
int num = 0; %>
<s:iterator value="zhengMingAnalyseList" status="var" >
<%
num = count % 2;
%>
<tr class="tChoice<%=num%>" onmouseover='this.className="tChoice"' onmouseout='this.className="tChoice<%=num%>"'>
<td class="sTd" nowrap="nowrap" onClick="zhankaiOrHebing('row1')" style="display:none">
<img id="imagerow1" src="<%=request.getContextPath()%>/jsp/js/img/plus.gif" />
</td>
<td class="sTd" nowrap="nowrap" >c
${zhengMingAnalyseList[var.index].zhengming}
</td>
<td class="sTd" nowrap="nowrap" align="center">
${zhengMingAnalyseList[var.index].count}
</td>
<td class="sTd" nowrap="nowrap" >
<!-- 循环该证型下的中药频数统计列表 -->
<c:forEach items="${zhengMingZhongYaoCountMap}" var="map">
<c:if test="${fn:containsIgnoreCase(fn:trim(map.key.zhengming),fn:trim(zhengMingAnalyseList[var.index].zhengming))}" var="true">
<c:forEach items="${map.value}" var="zhongYaoCountList">
${zhongYaoCountList.name}:${zhongYaoCountList.count}、
</c:forEach>
</c:if>
</c:forEach>
</td>
</tr>
<% count++; %>
</s:iterator>
</table>
</body>
<script type="text/javascript">
</script>
</html>
展示结果如下: