本帖最后由 zxkevin1989 于 2012-01-04 14:38:46 编辑

解决方案 »

  1.   

    说实话,其实一开始我也不知道有这个算法,结果一搜,还真有
    http://hi.baidu.com/luosiyong/blog/item/18a1f21bb54588f8af5133c0.html
    学到了
      

  2.   


    我只是按你说的那个算法搜的ooo,我其实也是第一次听说这个算法哦哦
      

  3.   

    楼主啊,所谓备忘录算法,其实就是缓存机制。做任何计算或者查询之前,先看看缓存里面有没有(这里用HashMap),缓存已有就直接返回;没有就真的去执行计算或查询,然后写入缓存,然后返回。
      

  4.   

    List<Map> list = this.baseDaoEntity.queryForList(sql, paramMap);


    List<Map> resultList = new ArrayList<Map>();
            Map<String, Map> bwl = new HashMap<String, Map>();
            
            if(list != null){
             for(Map map : list){
             String fp_xmfb_id = (String) map.get("ID");
             if (!bwl.containsKey(fp_xmfb_id)) {
         resultList.add(map);
         bwl.put(fp_xmfb_id, map);
        
         List<Map> detailList = new ArrayList<Map>();
         detailList.add(map);
         map.put("detailList", detailList);
         } else {
         List<Map> detailList =  (List)bwl.get(fp_xmfb_id).get("detailList");
         detailList.add(map);
         }
             }
            }
            return resultList;
    他按某个字段重构list的时候先把代表一类的map放到list中,在这个map里面又放了一个小分类的list而,他竟然又把这个小list所在的map放到这个小list中,这是不是有点乱啊,虽然说对于map,list这种指向都是操作内存地址的,理论上能相互指向,但是这样总感觉有点别扭。
    不知道我的理解对不对,还望指点啊。
      

  5.   

    感觉这个谈不上什么算法,楼主别想复杂了,
    看大概意思应该是一个map对应页面上的一个table。说白了,就是把list分块,第块一个table。
    你看他上面也是定义了4个map,说明这代码也不通用,要是页面上有5个表的话,还一样得改代码。
    这和你直接传4个list到页面效果是一样的。估计不是老人不愿意给你讲,可能这实在没什么可说的地方。谈不上设计,也谈不上技巧,业务而已。
      

  6.   

    最近比较浮躁,耐着性子又把代码完整看了一遍,大致理解了。楼主下次问这类问题,最好把前端展现效果贴上来,在理解目标需求的基础上来理解设计模式才比较快。根据对代码的理解,我先说明下前端展现效果,看是否正确:
    ◎ 前端展现其实是个分类列表模型,有点类似于OrderBy,但却是很奇怪为啥他没有在数据库里面用OrderBy,也许受限于数据结构问题;
    ◎ 展示模式顺序是:品牌,型号,报价,折扣;类似于:
    品牌:AA
    --型号:AA07
    ----报价:10W
    ------明细行(折扣:90%,说明:xxooxxoo,备注:xxooxxoo)
    ------明细行(折扣:80%,说明:xxooxxoo,备注:xxooxxoo)
    ----报价:12W
    ------明细行(折扣:90%,说明:xxooxxoo,备注:xxooxxoo)
    ------明细行(折扣:80%,说明:xxooxxoo,备注:xxooxxoo)
    --型号:AA05
    ----报价:22W
    ------明细行(折扣:40%,说明:xxooxxoo,备注:xxooxxoo)
    ------明细行(折扣:30%,说明:xxooxxoo,备注:xxooxxoo)
    ----报价:8W
    ------明细行(折扣:90%,说明:xxooxxoo,备注:xxooxxoo)
    ------明细行(折扣:80%,说明:xxooxxoo,备注:xxooxxoo)
    品牌:BB
    ......
    应该说代码设计者还是有些技巧,虽然整体结构不能说非常优美。他的模型出发点就是用HashMap保存了每个分类(ppBwl、xhBwl、bjBwl),这样便于后续快速定位该分类的入口,便于快速添加其子项内容(xhList、spList、zkList)。Anyway,能解决问题,总体性能也不差;备忘录HashMap也并没有暴露到函数外面去(没有被直接或间接的被resultList所引用),也就意味着函数结束就全都释放了,所以没啥好纠结的。但楼主对于你而言,应该挑战下自己,怎么去设计出更优美或更高效的实现模型,就算最后失败了也是一种收获。
      

  7.   

    十分感谢,大致了解了,前端显示基本就是您分析的效果,其实这样写的目的好像就是为了列表序号。因为项目用了tapestry框架,面向组件,一个list只能对应一个index(显示序号用的),像这种分类列表,每个分类的小列表的序号仍然要从1按顺序显示,如果不构造多个list就即使用了orderby仍然没法按要求从1开始顺序显示序号,当然也可以传参数按分类查出多个list显示,但是要多次访问数据库,可能为了减少数据库的访问次数所以用了这种方法(具体目的是什么我不太清楚)。个人比较菜,其实也想不出更好的方法,如果按我分析的其实不用什么算法,直接得到整个list后简单的循环判断按某具体要求分类成几个小list再重新封装到一个list返回就行了,操作上麻烦点,理解上简单点。
    您的教诲,谨记心间,一定努力,以后还望多指教哈!