JSP中遍历List、Map

    在实际项目中,经常会遇到在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>

展示结果如下:
展现结果

  • 1
    点赞
  • 0
    评论
  • 0
    收藏
  • 打赏
    打赏
  • 扫一扫,分享海报

参与评论 您还未登录,请先 登录 后发表或查看评论
©️2022 CSDN 皮肤主题:编程工作室 设计师:CSDN官方博客 返回首页

打赏作者

阿弥陀佛1114

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值