好久没来这里逛了哈,这些天实在懒得写东西了,工作以后才知道编程确实是件很痛苦的事,虽然每次完成任务时总是压抑不住心中那种成功的喜悦(很阿Q)。
最近任务不多,总想给自己点事做做,于是开始研究jdk中一个很重要的数据类型----Map。
map的数据结构类似于数据库的数据存储方式,键和值的对应,之间的映射,更重要的一点是通过map.entry这个类似于指针的接口在外部对其进行任意的修改。在这里我们通过一个动态生成树的例子介绍一下它的用法吧...
网页中,树型目录菜单是一个很常见的菜单显示方式,通常我们都是利用已经设置好的数据通过客户端脚本拼装后展现,在树的结构比较简单或要求显示效果绚丽的话,是一个很好的选择。如果我们的树型目录是一个不断变化的树呢,比如用树来显示一个部门的所有员工的在线状态?
这时我们就需要考虑用后台实现了,通过map,我们假设它的key对应的是树的目录名称,key对应它的链接地址。如果有下级目录,则把该目录再封装到一个新的map中,作为主map的一个节点。这样就可以使用一个主map展现目录的所有内容了。
代码贴出来吧,发现这里的html代码编辑功能实在太差了-_-!!.
/** * 列出树型列表的所有元素 * 该方法将把所有节点的元素展开,如果需要,应该在前台进行重新包装 * 这里要注意的是map的实现类要为TreeMap,其他类型的话,要修改 * equals(TreeMap.class) ,下面的另一个方法同理 * @param map * @return */ public static String getType(Map map) { Set set = map.entrySet(); Iterator it = set.iterator(); while (it.hasNext()) {// 把当前要遍历的节点当作根节点 Map.Entry entry = (Map.Entry) it.next(); if (entry.getValue().getClass().equals(TreeMap.class)) {// 下一级节点 System.out.println(entry.getKey());// 读取该节点的名称 getType((TreeMap) entry.getValue()); } else {// 到达该节点的顶点 System.out.println(entry.getKey() + ":" + entry.getValue()); } } return null; }
利用迭代的方法可以写出取某节点下的所有内容、指定节点的内容等功能,方法大同小异,这里不敷述了。map的数据来源可以是多样的,最主要的是从数据库中取得数据,对于map如何和数据库数据进行映射,网上应该资料很多,关键在于把所需要的数据先包装到一个bo中,再对map进行填充。目前hibernate应该是不个不错的选择。 map于xml的转换,其实也是很简单的:
/** * 将map类型数据转换成XML文档 * * @param map * 该节点 * @param element * 上一级节点 * @return */ public void parseToXML(Map map, Element element) { /** 开始对map进行解析 */ if (map == null) throw new NullPointerException("map 数据为空,不能解析!"); Set set = map.entrySet(); Iterator records = set.iterator(); while (records.hasNext()) { Map.Entry entry = (Map.Entry) records.next(); if (entry.getValue().getClass().equals(TreeMap.class)) {// 子目录 Element node = new Element("node"); node.setAttribute("name", entry.getKey().toString()); element.addContent(node); parseToXML((TreeMap) entry.getValue(), node); } else {// 到达顶点 Element node = new Element("node"); node.setAttribute("name", entry.getKey().toString()); Element value = new Element("value"); value.setText(entry.getValue().toString()); node.addContent(value); element.addContent(node); } }}注意的是element是需要获取的,当我们声明了一个xml doc文档后,根节点root可以作为参数传进去,处理完后,再对root进行读取就可以了:
parseToXML(map, root); doc = new Document(root);这样我们就可以把map转换成一个树型目录了,具体的应用,随意了。