什么是——备忘录算法——求高人指点啊! 本帖最后由 zxkevin1989 于 2012-01-04 14:38:46 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 说实话,其实一开始我也不知道有这个算法,结果一搜,还真有http://hi.baidu.com/luosiyong/blog/item/18a1f21bb54588f8af5133c0.html学到了 我只是按你说的那个算法搜的ooo,我其实也是第一次听说这个算法哦哦 楼主啊,所谓备忘录算法,其实就是缓存机制。做任何计算或者查询之前,先看看缓存里面有没有(这里用HashMap),缓存已有就直接返回;没有就真的去执行计算或查询,然后写入缓存,然后返回。 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这种指向都是操作内存地址的,理论上能相互指向,但是这样总感觉有点别扭。不知道我的理解对不对,还望指点啊。 感觉这个谈不上什么算法,楼主别想复杂了,看大概意思应该是一个map对应页面上的一个table。说白了,就是把list分块,第块一个table。你看他上面也是定义了4个map,说明这代码也不通用,要是页面上有5个表的话,还一样得改代码。这和你直接传4个list到页面效果是一样的。估计不是老人不愿意给你讲,可能这实在没什么可说的地方。谈不上设计,也谈不上技巧,业务而已。 最近比较浮躁,耐着性子又把代码完整看了一遍,大致理解了。楼主下次问这类问题,最好把前端展现效果贴上来,在理解目标需求的基础上来理解设计模式才比较快。根据对代码的理解,我先说明下前端展现效果,看是否正确:◎ 前端展现其实是个分类列表模型,有点类似于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所引用),也就意味着函数结束就全都释放了,所以没啥好纠结的。但楼主对于你而言,应该挑战下自己,怎么去设计出更优美或更高效的实现模型,就算最后失败了也是一种收获。 十分感谢,大致了解了,前端显示基本就是您分析的效果,其实这样写的目的好像就是为了列表序号。因为项目用了tapestry框架,面向组件,一个list只能对应一个index(显示序号用的),像这种分类列表,每个分类的小列表的序号仍然要从1按顺序显示,如果不构造多个list就即使用了orderby仍然没法按要求从1开始顺序显示序号,当然也可以传参数按分类查出多个list显示,但是要多次访问数据库,可能为了减少数据库的访问次数所以用了这种方法(具体目的是什么我不太清楚)。个人比较菜,其实也想不出更好的方法,如果按我分析的其实不用什么算法,直接得到整个list后简单的循环判断按某具体要求分类成几个小list再重新封装到一个list返回就行了,操作上麻烦点,理解上简单点。您的教诲,谨记心间,一定努力,以后还望多指教哈! 应该是一个Spring多个配置文件问题,访问Hibernate的映射文件时报错 在大学期间是否该去考取证书 freemarker 模板文件引入标签问题 Tomcat6.0数据库连接池的配置 SSH 框架开发问题,请给提供指导 请教关于JAVA在企业EDI上的应用 学习使用ejb难道不是跟风吗? 求教一个初学者的问题,在线等,比较急 javabean和ejb的区别?望各位高手详细指点!3KU!! 求大神指导js里面构建table,怎么取table里的值啊 jms 封装 spring mvc的xml文件加载问题。
http://hi.baidu.com/luosiyong/blog/item/18a1f21bb54588f8af5133c0.html
学到了
我只是按你说的那个算法搜的ooo,我其实也是第一次听说这个算法哦哦
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这种指向都是操作内存地址的,理论上能相互指向,但是这样总感觉有点别扭。
不知道我的理解对不对,还望指点啊。
看大概意思应该是一个map对应页面上的一个table。说白了,就是把list分块,第块一个table。
你看他上面也是定义了4个map,说明这代码也不通用,要是页面上有5个表的话,还一样得改代码。
这和你直接传4个list到页面效果是一样的。估计不是老人不愿意给你讲,可能这实在没什么可说的地方。谈不上设计,也谈不上技巧,业务而已。
◎ 前端展现其实是个分类列表模型,有点类似于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所引用),也就意味着函数结束就全都释放了,所以没啥好纠结的。但楼主对于你而言,应该挑战下自己,怎么去设计出更优美或更高效的实现模型,就算最后失败了也是一种收获。
您的教诲,谨记心间,一定努力,以后还望多指教哈!