首先创建一个树的节点
package com.stxdalian.redbook.structure; import java.util.LinkedList; public class TreeNode { String data; TreeNode parent; LinkedList<TreeNode> childlist; TreeNode() { data = null; childlist = new LinkedList<TreeNode>(); parent = null; } }
再实现树的基本操作
package com.***.redbook.structure; import java.util.ArrayList; import java.util.HashMap; import javassist.expr.NewArray; public class MultiTree { ArrayList<String> resultExcel = new ArrayList<String>(); ArrayList<ArrayList<Object>> tempResult; public MultiTree(){ tempResult = new ArrayList<ArrayList<Object>>(); TreeNode root = new TreeNode(); root.data="root"; ArrayList<String> testArr = new ArrayList<String>(); testArr.add("ddd"); testArr.add("aaa"); testArr.add("ccc"); testArr.add("bbb/x"); testArr.add("bbb/y"); testArr.add("eee/a"); testArr.add("eee/b"); testArr.add("eee/c/a"); testArr.add("eee/c/m"); testArr.add("eee/c/n"); for (String string : testArr) { arrTotree(string,root); } System.out.println("--------------------->>"+getMaxTreece(root)); treeToArr(root,0,getMaxTreece(root)); treeToTable(tempResult,getMaxTreece(root)); } /** * 返回一个表格的头 * 数据类型为 arraylist<行arraylist<[value='',rowspan='',colspan='']>> * @param tmpArr * @param maxce * @return */ public ArrayList<ArrayList<HashMap<String,String>>> treeToTable(ArrayList<ArrayList<Object>> tmpArr,int maxce){ ArrayList<ArrayList<HashMap<String,String>>> totalresultTable = new ArrayList<ArrayList<HashMap<String,String>>>(); for(int i=0;i<=maxce;i++){ ArrayList<HashMap<String,String>> resultTable = new ArrayList<HashMap<String,String>>(); for(ArrayList<Object> item:tmpArr){ HashMap<String, String> hangHS = new HashMap<String, String>(); if(item.get(3).equals(i)){ hangHS.put("value", item.get(0).toString()); hangHS.put("rowspan", item.get(1).toString()); hangHS.put("colspan", item.get(2).toString()); resultTable.add(hangHS); } } totalresultTable.add(resultTable); } return totalresultTable; } //TODO 传递任意一棵树,计算位置 /** * 把一棵树转换为数组 【名称,合并的层数,合并的列数,树的层次】 * 行不等于0的时候,要回行输出 * @param curtroot */ public void treeToArr(TreeNode f,int level,int maxce){ for(int i=0; i<f.childlist.size(); i++) { TreeNode t = f.childlist.get(i); if(! t.childlist.isEmpty()) { ArrayList<Object> tmpInarr = new ArrayList<Object>(); tmpInarr.add(t.data); tmpInarr.add("0"); tmpInarr.add(getTreeye(t)); tmpInarr.add(level); tempResult.add(tmpInarr); System.out.println(t.data+0+"-"+getTreeye(t)+"-"+level); treeToArr(t, level + 1,maxce); }else{ ArrayList<Object> tmpInarr = new ArrayList<Object>(); tmpInarr.add(t.data); tmpInarr.add((maxce-level+1)); tmpInarr.add(getTreeye(t)); tmpInarr.add(level); tempResult.add(tmpInarr); System.out.println(t.data+(maxce-level+1)+"-"+getTreeye(t)+"-"+level); } } } /** * 创建一个树 * @param testStr 树结构字符串 * @param curtroot 根节点 */ public void arrTotree(String testStr,TreeNode curtroot){ if(testStr.indexOf("/")>0){ int endIndex = testStr.indexOf("/"); TreeNode nodeChild ; //判断这个节点是否已经存在,存在就不要建了 if(isexist(testStr.substring(0, endIndex),curtroot)==null){ nodeChild = new TreeNode(); nodeChild.data = testStr.substring(0, endIndex); curtroot.childlist.add(nodeChild); }else{ nodeChild = isexist(testStr.substring(0, endIndex),curtroot); } String nextxt = testStr.substring(endIndex+1); arrTotree(nextxt,nodeChild); } else{ TreeNode nodeChild = new TreeNode(); nodeChild.data = testStr; curtroot.childlist.add(nodeChild); } } /** * 判断节点是否存在 * @param testStr 测试的节点 * @param curtroot 当前树 * @return */ public TreeNode isexist(String testStr,TreeNode curtroot){ TreeNode currtchild = null ; for(int i=0; i<curtroot.childlist.size(); i++) { if(testStr.equals(curtroot.childlist.get(i).data)){ currtchild = curtroot.childlist.get(i); } } return currtchild; } /** * 递归显示树 * @param f * @param level */ public void displaytree(TreeNode f, int level) { String preStr = ""; int m=0; for(int i=0; i<level; i++) { preStr += " "; m+=1; } for(int i=0; i<f.childlist.size(); i++) { TreeNode t = f.childlist.get(i); System.out.println(preStr + "-"+t.data+m); if(! t.childlist.isEmpty()) { displaytree(t, level + 1); } } } /** * 获得一个树的最大层次 * @param f * @return */ public int getMaxTreece(TreeNode f){ int temp = 0; for (int i = 0; i < f.childlist.size(); i++) { if(temp < this.getTreece(f.childlist.get(i))){ temp = this.getTreece(f.childlist.get(i)); } } return temp; } /** * 获得树的层次,根为-1,第一层为0 * @param f * @return */ public int getTreece(TreeNode f){ int result = 0; for(int i=0; i<f.childlist.size(); i++) { int tmp=0; if(f.childlist.get(i).childlist.isEmpty()){ result = 1; //为叶子节点,那么层次为1 } else{ result = result+ getTreece(f.childlist.get(i)); } } return result; } /** * 获得树的叶子个数 * @param f * @return */ public int getTreeye(TreeNode f){ int result = 0; for(int i=0; i<f.childlist.size(); i++) { int tmp=0; if(f.childlist.get(i).childlist.isEmpty()){ result = result+1; //为叶子节点 } else{ tmp = getTreeye(f.childlist.get(i)); } result = result + tmp; } return result; } }
3
SELECT 'SHIP NO.' AS HEADERS, 'PROJECT_NO' AS DEPT_CODE, '0' AS POSITION_CODE, '0' AS WORK_CODE FROM DUAL UNION ALL SELECT CASE WHEN #{lang}= 'KOR' THEN '시리즈' ELSE '系列' END HEADERS , 'SERIES_PROJECT' , '1', '1' FROM DUAL UNION ALL SELECT CASE WHEN #{lang}= 'KOR' THEN '선종' ELSE '船种' END HEADERS , 'SHIPTYPE' , '2', '2' FROM DUAL UNION ALL SELECT CASE WHEN #{lang}= 'KOR' THEN '선주' ELSE '船东' END HEADERS, 'OWNER' , '3', '3' FROM DUAL UNION ALL SELECT CASE WHEN #{lang}= 'KOR' THEN '선급' ELSE '船级社' END HEADERS, 'CLASS1' , '4', '4' FROM DUAL UNION ALL SELECT CASE WHEN #{lang}= 'KOR' THEN 'PC(정)' ELSE 'PC(正)' END HEADERS, 'PC' , '5', '5' FROM DUAL UNION ALL SELECT HEADERS, DEPT_CODE,POSITION_CODE,WORK_CODE FROM ( SELECT DISTINCT HEADERS,DEPT_CODE,POSITION_CODE,WORK_CODE,WC_STEP, PC_STEP FROM ( SELECT D.DEPT_NAME, D.DEPT_CODE, P.POSITION_CODE, P.WORK_CODE , WC.C_STEP AS WC_STEP, PC.C_STEP AS PC_STEP, STX_IBD_KEYMAN_PKG.GET_CODE_NAME(#{lang},'WCODE', P.WORK_CODE)||'/'|| REPLACE(DECODE(#{lang},'KOR',D.ATTRIBUTE2,D.DEPT_NAME),'Team','' )||'/'|| STX_IBD_KEYMAN_PKG.GET_CODE_NAME(#{lang},'PCODE', P.POSITION_CODE) AS HEADERS FROM STX_IBD_PM P, STX_IBD_PM_PROJECT PR, LPM_PROJECT_HI L, STX_COM_INSA_USER U, STX_COM_INSA_DEPT D, STX_IBD_ISSUE_CODE PC, STX_IBD_ISSUE_CODE WC WHERE P.PROJECT_NO = PR.PROJECT_NO AND P.PROJECT_NO = L.PROJECTNO AND P.EMPNO = U.EMP_NO AND U.DEPT_CODE = D.DEPT_CODE AND P.POSITION_CODE = PC.CID AND P.WORK_CODE = WC.CID AND PC.GCID = 'PCODE' AND WC.GCID = 'WCODE' AND NVL(PR.END_DATE, TO_DATE(TO_CHAR(SYSDATE ,'YYYY-MM-DD'),'YYYY-MM-DD')) >=TO_DATE(TO_CHAR(SYSDATE ,'YYYY-MM-DD'),'YYYY-MM-DD') AND NVL(PC.DISABLE_DATE, TO_DATE(TO_CHAR(SYSDATE ,'YYYY-MM-DD'),'YYYY-MM-DD')) >=TO_DATE(TO_CHAR(SYSDATE ,'YYYY-MM-DD'),'YYYY-MM-DD') AND NVL(WC.DISABLE_DATE, TO_DATE(TO_CHAR(SYSDATE ,'YYYY-MM-DD'),'YYYY-MM-DD')) >=TO_DATE(TO_CHAR(SYSDATE ,'YYYY-MM-DD'),'YYYY-MM-DD') AND (#{project_no} IS NULL OR ( #{project_no} IS NOT NULL AND P.PROJECT_NO = #{project_no})) AND P.POSITION_CODE LIKE #{position_code} AND P.WORK_CODE LIKE #{work_code} AND (#{dept_code} IS NULL OR ( #{dept_code} IS NOT NULL AND U.DEPT_CODE = #{dept_code})) AND L.SHIPTYPE LIKE #{shiptype} AND (#{empnm} IS NULL OR ( #{empnm} IS NOT NULL AND ( U.USER_NAME LIKE '%${empnm}%' OR U.USER_NAME_KOR LIKE '%${empnm}%'))) AND D.USE_YN ='Y' AND P.POSITION_CODE >='2' ORDER BY TO_NUMBER(WC.C_STEP),D.DEPT_CODE,TO_NUMBER(PC.C_STEP) ) ORDER BY TO_NUMBER(WC_STEP),DEPT_CODE,TO_NUMBER(PC_STEP) )
相关推荐
struts2+spring2.5+hibernate3.2 + freemarker 全新功能实现的增删改查+freemarker 摸版 struts2 的方式自己去看简单。 spring2.5 是用注释来注入 hibernate3.2 是用ejb3注解映射关系 hibernate3 +个属性可以自动...
Struts2、Hibernate和FreeMarker是Java开发领域中常见的三个开源框架,它们分别在MVC(Model-View-Controller)架构的不同层面发挥着关键作用。这个"struts2+hibernate+freemarker"项目实例是将这三个框架集成到一起...
• 采用hibernate3+struts2+spring2+freemarker主流技术架构 • 懂html就能建站,提供最便利、合理的使用方式 • 强大、灵活的标签,用户自定义显示内容和显示方式 • 在设计上自身预先做了搜索引擎优化,增强对...
JEECMS使用目前java主流技术架构:hibernate3+struts2+spring2+freemarker。AJAX使用jquery和json实现。视图层并没有使用传统的JSP技术,而是使用更为专业、灵活、高效freemarker。 数据库使用MYSQL,并可支持orcale...
在新闻发布系统中,Freemarker被用作视图层技术,与Struts2结合,根据Action返回的数据动态生成静态页面。这样可以将业务逻辑与表现逻辑分离,使得代码更加清晰。 5. **用户认证与权限管理** 系统中预设了一个管理...
整合S2SH+Freemarker,后台用Spring管理各个bean,Hibernate做数据库持久化,viewer用Freemarker。整合中对Struts2,Hibernate,Spring都采用Annotation进行注解类。
部署到tomcat中, 访问/freemarker/build_index.action 点击首页生成,当显示生成成功过后 然后访问 ... 已经完美将struts2+freemarker+spring整合~ 希望对你们有所帮助。 经测试:tomcat5.5 无法正常运行
整合S2SH+Freemarker+oscache,后台用Spring管理各个bean,Hibernate做数据库持久化,viewer用Freemarker。整合中对Struts2,Hibernate,Spring都采用Annotation进行注解类。
基于SpringBoot+freemarker实现的人事管理系统分为七大模块:绩效考核,招聘管理,档案管理,工资管理,考勤管理,培训管理,系统管理。本系统最大特色是有强大和灵活的权限控制功能,所有菜单,按钮功能均可由管理...
通过这种方式,开发者可以利用Struts2的强大功能处理业务逻辑,同时利用FreeMarker的简洁模板语言生成动态视图,实现MVC架构的良好分离。这种结合在实际项目中非常常见,尤其适合大型复杂的企业级应用。
Struts2是Action框架,主要负责处理用户请求、业务逻辑控制以及与视图层的交互,而Freemarker则是一种模板引擎,用于生成动态HTML或其他格式的输出。 **Struts2** 是Apache软件基金会下的一个开源项目,它是基于MVC...
总之,“struts2+freemarker 生成静态页面”是一个旨在提升Web应用性能的技术实践,通过结合Struts2的MVC框架和FreeMarker的模板引擎,实现了动态内容到静态HTML的转化,为用户提供更快的加载速度和更好的浏览体验。...
Struts2+Hibernate+Freemarker实现【增删改查】生成静态页面!这是一个相对网上较全的案例。源码内含数据库文件sql.sql及效果图!本人致力于完整的Demo。欢迎关注!回头补上分页。敬请期待!
1、基于springboot+mvc+freemarker+aop实现校友信息管理系统源码.zip 2、该资源包括项目的全部源码,下载可以直接使用! 3、本项目适合作为计算机、数学、电子信息等专业的课程设计、期末大作业和毕设项目,作为参考...
总之,“Struts2+freemarker+flash 采集摄像头头像”项目展示了如何利用传统的Web技术栈实现用户头像的在线采集和展示,其中涉及到了后端框架、模板引擎和前端多媒体交互等多个技术层面。尽管随着技术的发展,这些...
Struts2和Freemarker是两个非常流行的Java Web开发框架,它们经常被一起使用来构建动态、交互式的Web应用程序。国际化(Internationalization,通常缩写为i18n)是软件开发中的一个重要概念,它允许应用程序支持不同...
资源 struts2+spring2+hibernate3+tiles+freemarker+ibatis 架构图 的具体实现,注意没有java源文件,大家可以看一下配置,具体实现大家不防试一把 <br>下载架构图一目了然哦:...
基于springboot+mvc+freemarker+aop实现校友信息管理系统.zip基于springboot+mvc+freemarker+aop实现校友信息管理系统.zip基于springboot+mvc+freemarker+aop实现校友信息管理系统.zip基于springboot+mvc+freemarker...
Struts2和FreeMarker是两种在Java Web开发中广泛使用的框架和技术。Struts2作为MVC(模型-视图-控制器)架构的一部分,主要用于处理业务逻辑和控制流程,而FreeMarker则是一个模板引擎,用于生成动态HTML或其他类型...