java使用遞迴迭代實現流程圖展示(僅供參考)
本人在做專案的時候不確定流程圖展示的節點下是否還有子節點,所以才採用遞迴方式進行迴圈判斷。
1、實體類model
package com.ijs.model; import java.util.List; import javax.persistence.Entity; import javax.persistence.Table; import javax.persistence.Transient; /** * ProcessPoint entity. @author MyEclipse Persistence Tools */ @Entity @Table(name = "process_point") public class ProcessPoint extends AbstractProcessPoint implements java.io.Serializable { //用於存放子節點 private List<ProcessPoint> childrenProcessPoint; // Constructors /** default constructor */ public ProcessPoint() { } /** minimal constructor */ public ProcessPoint(String id) { super(id); } /** full constructor */ public ProcessPoint(String id, String processId, String code, String name, Integer ownerRole, Integer owner, Integer status, Integer ppOrd, Integer ppType, String ppDesc, String pid, Integer ppLogic, String ppLogicWith) { super(id, processId, code, name, ownerRole, owner, status, ppOrd, ppType, ppDesc, pid, ppLogic, ppLogicWith); } @Transient public List<ProcessPoint> getChildrenProcessPoint() { return childrenProcessPoint; } public void setChildrenProcessPoint(List<ProcessPoint> childrenProcessPoint) { this.childrenProcessPoint = childrenProcessPoint; } }
2、業務邏輯層Service
3.業務邏輯層實現ServiceImplpackage com.ijs.service; import java.util.List; import com.ijs.model.ProcessPoint; public interface ProcessPointServ { /** * 獲取所有的節點資訊進行遞迴迭代使用 * @return */ public List<ProcessPoint> getProcessPoints(); /** * 根據當前節點資訊id查詢該流程節點資訊下是否還有子節點資訊 * @param pid * @return */ public List<ProcessPoint> findByPid(String pid); }
4、控制器層Controllerpackage com.ijs.service.impl; import java.util.List; import javax.annotation.Resource; import org.springframework.stereotype.Service; import com.ijs.dao.GenericDao; import com.ijs.model.ProcessPoint; import com.ijs.service.ProcessPointServ; import com.ijs.service.ProjectServ; @Service("processPointServ") public class ProcessPointServImpl implements ProcessPointServ { @Resource private GenericDao genericDao; public List<ProcessPoint> getProcessPoints() { StringBuffer jpql = new StringBuffer(); jpql.append(" from ProcessPoint p where 1=1"); jpql.append(" and p.status = 1 "); jpql.append(" order by -p.code desc"); List<ProcessPoint> processPoints = this.genericDao.find(jpql.toString()); return processPoints.size()==0?null:processPoints; } @Override public List<ProcessPoint> findByPid(String pid) { if(pid!=null){ StringBuffer jpql = new StringBuffer(); jpql.append(" from ProcessPoint p where 1=1"); jpql.append(" and p.status = 1 and p.pid='"+pid+"'"); jpql.append(" order by p.ppOrd"); List<ProcessPoint> processPoints = this.genericDao.find(jpql.toString()); return processPoints.size()==0?null:processPoints; } return null; } }
package com.ijs.control;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import javax.annotation.Resource;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import com.ijs.model.ProcessPoint;
import com.ijs.service.ProcessPointServ;
@Controller
@RequestMapping("/processpoint")
public class ProcessPointControl {
@Resource(name="processPointServ")
private ProcessPointServ processPointServ;
/**
* 檢視專案流程圖
* @param processPoint
* @return
*/
@RequestMapping(value="/showprocesspoint",method = RequestMethod.POST)
public @ResponseBody ProcessPoint showProcessPoint(@ModelAttribute ProcessPoint processPoint){
try {
//處理好的流程圖節點集合物件
List<ProcessPoint> processPoints =this.getProcessPoints(this.processPointServ.getProcessPoints());
if(processPoints!=null){
//將處理好的流程圖節點集合物件賦值物件的子節點集合屬性(private List<ProcessPoint> childrenProcessPoint;),方便頁面通過該物件取出資料進行迭代顯示
processPoint.setChildrenProcessPoint(processPoints);
}
} catch (Exception e) {
e.printStackTrace();
}
return processPoint;
}
/**
* 處理查詢出所有流程圖節點資訊進行相應的處理
* @param processPoints
* @return
*/
private List<ProcessPoint> getProcessPoints(List<ProcessPoint> processPoints){
//宣告一個新的集合物件進行接收,存放新的節點資訊,迴圈迭代判斷該節點下是否有子節點資訊,如有進行新增
List<ProcessPoint> ps=null;
if(processPoints!=null){
ps=new ArrayList<ProcessPoint>();
for (ProcessPoint p: processPoints) {
//找到一級節點,從一級節點開始尋找
if(p.getPid().equals("0")){
//呼叫遞迴方法,判斷是否有子節點,有就進行新增
this.addIfHasChildren(p);
//將迭代完、判斷完的節點存入新的節點集合
ps.add(p);
}
}
}
//返回新的節點集合
return ps;
}
/**
* 遞迴判斷當前節點物件是否還有子節點,有就進行新增
* @param p
*/
private void addIfHasChildren(ProcessPoint p) {
//根據當前節點資訊id查詢該流程節點資訊下是否還有子節點資訊
List<ProcessPoint> processPoints=this.processPointServ.findByPid(p.getId());
//判斷集合是否有資料,processPoints.size()>2這裡是方便排序並列展示的節點使用,集合必須兩個物件才能進行比較然後排序
if(processPoints!=null && processPoints.size()>2){
//排序集合並列展示的資料的位置 2.1 2.2 2.3(見下資料庫資料結構)
sortListByCode(processPoints);
}
//集合不為空,將資料進行新增
p.setChildrenProcessPoint(processPoints);
//判斷集合是否有資料
if(p.getChildrenProcessPoint()!=null){
for(ProcessPoint pc:p.getChildrenProcessPoint()){
//根據當前節點資訊id查詢該流程節點資訊下是否還有子節點資訊
List<ProcessPoint> pc2=this.processPointServ.findByPid(pc.getId());
if(pc2!=null && pc2.size()>2){
//排序節點
sortListByCode(pc2);
}
//新增節點物件
pc.setChildrenProcessPoint(pc2);
//呼叫自己
this.addIfHasChildren(pc);
}
}
}
/**
* 排序流程選單節點
* 根據節點的Code排序
* @param processes
*/
private void sortListByCode(List<ProcessPoint> processPoints){
Collections.sort(processPoints, new Comparator<ProcessPoint>() {
@Override
public int compare(ProcessPoint o1, ProcessPoint o2) {
float code1=Float.parseFloat(o1.getCode());
float code2=Float.parseFloat(o2.getCode());
if(code1>code2) return 1;
else if(code1==code2) return 0;
else return -1;
}
});
}
}
5、javaScript進行資料的也採用了遞迴進行相應的處理
//這裡大家可以使用$.ajax取得資料後再這裡進行迭代展示
ProcessPoint.findProcessPoint(null,function(data){
//用於拼接字串在頁面展示
var str="<ul>";
str+="<li><a href='javascript:;' class='am-badge-secondary'>"+data.childrenProcessPoint[0].name+"</a>";
str+="<ul>";
//直接取到一級節點下的子節點進行迭代
var pp=data.childrenProcessPoint[0].childrenProcessPoint;
for(var i=0;i<pp.length;i++){
var o=pp[i];
str+="<li><a href='javascript:;' class='am-badge-secondary'>"+o.name+"</a>";
//遞迴呼叫,判斷該節點下是否有子節點
hansChildren(o);
str+="</li>";
}
str+="</ul>";
str+="<div class='arrow'></div>";
str+="</li></ul>";
//頁面展示流程圖div
$(el).find(".tree").html(str);
//遞迴方法 判斷該節點下是否有子節點
function hansChildren(o){
if(o.childrenProcessPoint!=undefined){
if(o.childrenProcessPoint.length>0){
str+="<ul>";
for(var j=0;j<o.childrenProcessPoint.length;j++){
var pc=o.childrenProcessPoint[j];
str+="<li><a href='javascript:;' class='am-badge-secondary'>"+pc.name+"</a>";
//遞迴呼叫
hansChildren(pc);
}
str+="</li></ul>";
str+="<div class='arrow'></div>";
}
}
}
});
6、jsp頁面
<div class="add-form clearfix">
<h2>專案進度流程</h2>
<div class="am-form-group am-u-sm-12 am-u-md-7" style="background-color:#CDCDCD;">
<label for="doc-ipt-1" class="am-u-sm-30 am-form-label">
查詢當前進度流程,不同顏色模組使用不同的方式處理。
</label>
</div>
</div>
<div class="tree-box pr">
<div class="terr-cart pa">
<input type="hidden" id="project_id" value="<%=this.id%>">
<ul>
<li><span class="am-badge-secondary am-round"></span>已經完成</li>
<li><span class="am-badge-success am-round"></span>進行中</li>
<li><span class="am-badge-default am-round"></span>未開始</li>
<li><span class="am-badge-danger am-round"></span>需要我處理的</li>
</ul>
</div>
<div class="tree"></div>
</div>
7、資料庫資料圖片
8、流程圖展示
相關推薦
java使用遞迴迭代實現流程圖展示(僅供參考)
本人在做專案的時候不確定流程圖展示的節點下是否還有子節點,所以才採用遞迴方式進行迴圈判斷。 1、實體類model package com.ijs.model; import java.util.List; import javax.persistence.Entity
各大android應用商店的展示權重 安卓應用商店關鍵詞+下載量+評價+其他這幾項佔的權重(僅供參考)
1、360手機助手 2、應用寶 應用寶權重最高的是評論,評論方面主要從評論質量與評論數量上下手,其它方面權重值較低,對APP排名影響度不大。 3、百度手機助手 在我對你百度手機助手的排名分析中,發現關鍵詞的權重很高,下載量等其它方面對其排名影響不大。而且這個市場的官方編輯可以直
Java語言程序設計(第三版)第二章課後習題答案(僅供參考)
[] main 是否 支付 都去 port span 時區 div 2.1 註意不同類型轉換 1 import java.util.Scanner; 2 3 public class Ch02 { 4 public static void main
[整理]二分查詢搜尋演算法原理及遞迴,迭代方法實現
折半查詢法也稱為二分查詢法,它充分利用了元素間的次序關係,採用分治策略,可在最壞的情況下用O(log n)完成搜尋任務。 【基本思想】 將n個元素分成個數大致相同的兩半,取a[n/2]與欲查詢的x作比較,如果x=a[n/2]則找到x,演算法終止。如果x<a[n/2],
leetcode589-二叉樹遞迴-迭代
題目:N-ary Tree Preorder Traversal前序遍歷N叉樹 遞迴解法 就是迴圈呼叫preorder函式來實現遞迴,程式碼: class Solution(object): #遞迴解法 def preorder(self, root):
演算法 遞迴 迭代 動態規劃 斐波那契數列 MD
Markdown版本筆記 我的GitHub首頁 我的部落格 我的微信 我的郵箱 MyAndroidBlogs baiqiantao bai
通過遞迴迭代去除=的base64解碼函式
base64的解碼過程中如果byte不滿足轉碼要求的話例如(二進位制資料長度需要為4的倍數),不滿足的話就要通過在資料後面補‘=’,把資料補到是4的倍數,然而‘=’是沒有任何含義的,如果我們在輸入的時候可以不考慮輸入‘=’,這就大大方便了輸入,沒有了那麼多的限制
Java基礎複習筆記--Iterator和ListIterator 迭代器的使用(遍歷集合) Java類集框架——Iterator和ListIterator 迭代器的使用(遍歷集合)
Java類集框架——Iterator和ListIterator 迭代器的使用(遍歷集合) 學習目標: 掌握集合輸出的標準操作。 掌握Iterator介面的主要作用及使用注意事項。 掌握ListIterator與Iterator介面的關係及區別。
Java類集框架——Iterator和ListIterator 迭代器的使用(遍歷集合)
學習目標: 掌握集合輸出的標準操作。 掌握Iterator介面的主要作用及使用注意事項。 掌握ListIterator與Iterator介面的關係及區別。 掌握ListIterator介面的使用限制。
Java學習筆記36:迭代器遍歷(for 、while)
while迴圈遍歷 Collection coll = new ArrayList(); coll.add("abc1"); coll.add("abc2"); coll.add("abc3"); coll.add("abc4"); Iterator it = coll.iterator
C++通過迭代修改字串本身(auto型別說明符)
以字串這種支援 for (declaration : expression) statement 這樣for語句迭代的資料結構為例,我們看看auto關鍵字在型別推斷中的作用。 string s = "I LOVE YOU!"; for (char ch : s){ cout <&
遞迴-斐波納挈數列(不死神兔)
1.遞迴,指在當前方法內呼叫自己的這種現象 public void method(){ System.out.println(“遞迴的演示”); //在當前方法內呼叫自己 method(); }
遞迴5.遞迴函式--進位制轉換(十進位制轉二進位制)
2727: 遞迴函式--進位制轉換(十進位制轉二進位制) Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 791 Solved: 328 [Subm
2727: 遞迴函式--進位制轉換(十進位制轉二進位制)
輸入一個非負整數(十進位制),呼叫遞迴函式輸出此整數對應的二進位制數。函式宣告如下:void conversion(int n); //將n轉換為二進位制輸出的遞迴函式宣告在以下程式的基礎上,新增conversion函式的定義,使程式能夠正確執行。 提交時,只需要提交conversion函式的定義程式碼即可。
資料結構--非遞迴遍歷二叉樹(利用輔助棧)
#include "StdAfx.h" #include <stdio.h> #include <stdlib.h> /*非遞迴方法前序遍歷二叉樹,利用輔助棧(指標陣列實現)。由於對指標不是很熟悉,程式碼較為混亂,基本上實現遍歷的功能。
使用python實現使用者註冊邏輯僅供參考(flask框架實現)
1.基本的註冊邏輯實現 2.這裡程式碼給的是使用者進入頁面,已經輸入了圖片驗證碼,由於前面程式碼邏輯比較簡單,程式碼就不上了,邏輯上來說就是使用者進入註冊頁面,輸入手機號碼,輸入圖片驗證碼,前端生成驗證碼唯一編碼,通常使用uuid,通用唯一識別符號,或者使用Linux時間戳向後臺後臺請求驗證碼圖
【演算法】二叉樹、N叉樹先序、中序、後序、BFS、DFS遍歷的遞迴和迭代實現記錄(Java版)
本文總結了刷LeetCode過程中,有關樹的遍歷的相關程式碼實現,包括了二叉樹、N叉樹先序、中序、後序、BFS、DFS遍歷的遞迴和迭代實現。這也是解決樹的遍歷問題的固定套路。 一、二叉樹的先序、中序、後序遍歷 1、遞迴模板 (1)
二、(3)二叉樹的後序遍歷(遞迴實現、迭代實現)
二叉樹本來是分層結構,但若施加某種約束(如遍歷),則可以轉變成線性結構。 二叉樹的遍歷方法主要有:前序遍歷(DLR),中序遍歷(LDR),後序遍歷(LRD),層次遍歷。本文主要介紹二叉樹後序遍歷方法,其中包括了遞迴和迭代兩種實現方式。 後序遍歷:左子樹->右子樹->根節點(根
二、(2)二叉樹的中序遍歷(遞迴實現、迭代實現)
二叉樹本來是分層結構,但若施加某種約束(如遍歷),則可以轉變成線性結構。 二叉樹的遍歷方法主要有:前序遍歷(DLR),中序遍歷(LDR),後序遍歷(LRD),層次遍歷。本文主要介紹二叉樹中序遍歷方法,其中包括了遞迴和迭代兩種實現方式。 中序遍歷:左子樹->根節點->右子樹(根
二、(1)二叉樹的先序遍歷(遞迴實現、迭代實現)
二叉樹本來是分層結構,但若施加某種約束(如遍歷),則可以轉變成線性結構。 二叉樹的遍歷方法主要有:前序遍歷(DLR),中序遍歷(LDR),後序遍歷(LRD),層次遍歷。本文主要介紹二叉樹前序遍歷方法,其中包括了遞迴和迭代兩種實現方式。 前序遍歷:根節點->左子樹->右子樹(根