首先创建一个树的节点
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) )