在项目中,可能会遇到机构树这种格式,但是数据库存储的数据 不能维护这样子的树,所以需要中间转换来完成,zTree可以支持pid,id,name的格式,但是easyui貌似不行,这里就给出刚刚码好的代码:

package com.xxx.pojo;

import java.util.ArrayList;
import java.util.List; public class ComboTree
{ private String id;
private String text;
private String state;
private String pid;
private String clickFlag;
private List<ComboTree> children; public ComboTree()
{
super();
this.setState("closed");
this.setId("00");
this.setText(null);
this.setClickFlag("off");
this.setChildren(new ArrayList<ComboTree>());
} public void clear()
{
this.setState("closed");
this.setId(null);
this.setText(null);
this.setChildren(null);
} @Override
public String toString()
{
StringBuilder sb = new StringBuilder();
sb.append("{\"id\":\"");
sb.append(this.id);
sb.append("\",\"text\":\"");
sb.append(this.text);
sb.append("\",\"clickFlag\":\"");
sb.append("off");
sb.append("\"");
if (!this.children.isEmpty())
{
sb.append(",\"state\":\"");
sb.append(this.state);
sb.append("\",\"children\":[");
boolean flag = false;
for (ComboTree c : this.children)
{
if (flag)
sb.append(",");
else
flag = true;
sb.append(c.toString());
}
sb.append("]");
}
sb.append("}");
return sb.toString();
} public String getPid()
{
return pid;
} public void setPid(String pid)
{
this.pid = pid;
} public void addChildren(ComboTree ct)
{
this.children.add(ct);
// System.out.println("add");
}
//添加一个节点
public boolean addNode(ComboTree ct){
//如果需要添加的节点的PID 为当前节点的ID, 则直接
//添加, 返回true
if(this.id == ct.pid ||
(this.id != null && ct.pid != null && this.id.equals(ct.pid))){
this.children.add(ct);
return true;
}
//委托给子节点
for(ComboTree cct: this.children){
if(cct.addNode(ct))
return true;
}
//无法添加成功
return false;
}
public String getId()
{
return id;
} public void setId(String id)
{
this.id = id;
} public String getText()
{
return text;
} public void setText(String text)
{
this.text = text;
} public String getState()
{
return state;
} public void setState(String state)
{
this.state = state;
} public List<ComboTree> getChildren()
{
return children;
} public void setChildren(List<ComboTree> children)
{
this.children = children;
} public String getClickFlag()
{
return clickFlag;
} public void setClickFlag(String clickFlag)
{
this.clickFlag = clickFlag;
} }

  

package com.xxx.util;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Queue;
import java.util.Set; import com.abc.pojo.ComboTree; public class TreeHelper { /**
* 输入无序的ComboTree 获得 List 类型的森林
* @param list0 无序ComboTree节点
* @return List<ComboTree> 森林
* */
@SuppressWarnings("null")
public static List<ComboTree> makeTree(List<ComboTree> list0) throws Exception{ //以pId为Key,而以pid为相同的ComboTree作为List为Value
Map<String,List<ComboTree>> mapForPid = new HashMap<String,List<ComboTree>>();
//以Id为Tree, 用来快速寻找到RootPID
Map<String,ComboTree> mapForId = new HashMap<String,ComboTree>();
//root pid set
Set<String> rps = new HashSet<String>(); //构造 两种类型的map
for(ComboTree ct : list0){
//构造ID Map
mapForId.put(ct.getId(), ct); //PID Map 构造
String pid = ct.getPid();
List<ComboTree> lct = mapForPid.get(pid);
if(lct == null){
//构造 Value类型
lct = new LinkedList<ComboTree>();
mapForPid.put(pid, lct);
}
//添加这个节点
lct.add(ct);
} //制作rootPidSet
{
//已经被寻找过的ID
Set<String> keySet = new HashSet<String>();
//寻找RootPID
for(String key : mapForId.keySet()){
//沿pid 直到rootPID
while(true){
//已经处理过这种节点,
//那么可以肯定该节点所在的rootPid已经被添加
if(keySet.contains(key)){
break;
}
//添加到keySet中, 表示该节点已经被处理
keySet.add(key);
ComboTree ct = mapForId.get(key);
if(ct == null){
//如果ct为null, 则表示该Key就是一个rootPID
rps.add(key);
break;
}
//下一个Pid
key = ct.getPid();
}
}
} //虚拟root结果树
List<ComboTree> vts = new LinkedList<ComboTree>();
//对所有的root Pid 进行处理
for(String key : rps){
List<String> queue = new LinkedList<String>();
ComboTree vt = new ComboTree();
vt.setId(key);
vt.setPid(null);
vt.setText("虚拟节点");
//添加根Id
queue.add(key);
while(!queue.isEmpty()){
String pid = queue.remove(0);
List<ComboTree> list = mapForPid.get(pid);
//没有pid对应的子树
if(list == null)
continue;
for(ComboTree ct : list){
//添加到queue中
queue.add(ct.getId());
//插入到正确的位置
if(!vt.addNode(ct)){
throw new Exception(ct+"无法插入到Tree中");
}
}
}
vts.add(vt);
}
//整理res结果
List<ComboTree> res = new LinkedList<ComboTree>();
for(ComboTree vct : vts){
//虚拟PID节点不能作为真实根节点
for(ComboTree ct: vct.getChildren()){
//添加真实节点
res.add(ct);
} }
return res;
}
public static ComboTree getComboTree(String id,String pid,String name){
ComboTree t = new ComboTree();
t.setId(id);
t.setPid(pid);
t.setText(name);
return t;
}
public static void main(String[] args) throws Exception {
List<ComboTree> list = new LinkedList<ComboTree>();
list.add(getComboTree("0",null,"root"));
list.add(getComboTree("1","0","root"));
list.add(getComboTree("2","0","root"));
list.add(getComboTree("3","2","root"));
list.add(getComboTree("4","3","root"));
list.add(getComboTree("5","4","root"));
list.add(getComboTree("6","2","root"));
list.add(getComboTree("A",null,"root"));
list.add(getComboTree("B","A","root"));
list.add(getComboTree("C","A","root"));
list.add(getComboTree("D","B","root")); list.add(getComboTree("a","aaaaa","root"));
list.add(getComboTree("aa","a","root"));
System.out.println(makeTree(list)); } }

  主要函数为makeTree, 需要ComboTree结构支持.

算法的思想为:

   搜索rootPID的集合,然后根据rootPID,构建出虚拟树,注意虚拟树,的root节点是无效的,在返回结果集合的时候需要剔除掉

运行结果:

  

java 生成easyui 所需要的森林的更多相关文章

  1. 从数据库读取数据并动态生成easyui tree构结

    一. 数据库表结构 二.从后台读取数据库生成easyui tree结构的树 1.TreeNode树结点类(每个结点都包含easyui tree 的基本属性信息) import java.io.Seri ...

  2. Java生成和操作Excel文件(转载)

    Java生成和操作Excel文件   JAVA EXCEL API:是一开放源码项目,通过它Java开发人员可以读取Excel文件的内容.创建新的Excel文件.更新已经存在的Excel文件.使用该A ...

  3. PHP 使用编码树,生成easyui中的tree样式

    生成树的时候,数据库中一般设计的都为无级数,即为:父子节点的树,例如:基本的数据表设计为: nodecode 节点编码 parentnodecode 父节点编码 nodename  节点名称 这样的形 ...

  4. 利用JAVA生成二维码

    本文章整理于慕课网的学习视频<JAVA生成二维码>,如果想看视频内容请移步慕课网. 维基百科上对于二维码的解释. 二维条码是指在一维条码的基础上扩展出另一维具有可读性的条码,使用黑白矩形图 ...

  5. Java生成验证码原理(jsp)

     验证码的作用: 验证码是Completely Automated Public Turing test to tell Computers and Humans Apart(全自动区分计算机和人类的 ...

  6. JAVA生成条形码

    1.下载生成条形码所需要的jar包barcode4j.jar: 2.java生成条形码代码 import java.awt.image.BufferedImage;import java.io.Fil ...

  7. Java生成CSV文件实例详解

    本文实例主要讲述了Java生成CSV文件的方法,具体实现步骤如下: 1.新建CSVUtils.java文件: package com.saicfc.pmpf.internal.manage.utils ...

  8. java 生成8位数字作为UID

    java 生成8位数字作为UUID: /*** * 生成uid 8位数字 */public static String generateUID(){ Random random = new Rando ...

  9. java生成随机序列号

    1.java生成随机序列号 String deleteUuid = UUID.randomUUID().toString(); 引用Jar包 //java-uuid-generator-3.1.3.j ...

随机推荐

  1. DevExpress Report 其他常用设计技巧

    原文:DevExpress Report 其他常用设计技巧 1 设置默认的打印纸张及页边距 选择Report-打开属性窗口,设置默认边距(Margins)和默认纸张(PaperKind). 2 修改R ...

  2. Node.js v0.10.31API手工-DNS

    原版的API品种,这是从以前的翻译和翻译风格不同 Node.js v0.10.31API手冊-文件夹 DNS 使用 require('dns') 引入此模块. dns 模块中的全部方法都使用了 C-A ...

  3. Grunt和Gulp构建工具在Visual Studio 2015中的高效的应用

    Grunt和Gulp构建工具在Visual Studio 2015中的高效的应用 Grunt和Gulp是Javascript世界里的用来做自动压缩.Typescript编译.代码质量lint工具.cs ...

  4. 教你发布Silverlight Bussiness Application(SQL Server 登录,局域网访问,以及使用ArcGIS Server服务需要注意的问题)

    原文:教你发布Silverlight Bussiness Application(SQL Server 登录,局域网访问,以及使用ArcGIS Server服务需要注意的问题) 之前发布过Silver ...

  5. hdu2203 KMP水的问题

    两种方法     首先是纯KMP #include<stdio.h> #include<string.h> #include<iostream> using nam ...

  6. [CLR via C#]1.2 将托管模块合并成程序集

    原文:[CLR via C#]1.2 将托管模块合并成程序集 1.CLR是不和托管模块一起工作的,CLR是和程序集一起工作的. 2. 程序集是一个或多个托管模块/资源文件的逻辑性分组.   3. 程序 ...

  7. .net mvc4 从客户端中检测到有潜在危险的 Request.Form 值

    [ValidateInput(false)] 即可, 网上说什么Web.Config 里面改,一点用都没有 [HttpPost] [ActionName("Edit")] [Val ...

  8. Spark集群搭建简配+它到底有多快?【单挑纯C/CPP/HADOOP】

    最近耳闻Spark风生水起,这两天利用休息时间研究了一下,果然还是给人不少惊喜.可惜,笔者不善JAVA,只有PYTHON和SCALA接口.花了不少时间从零开始认识PYTHON和SCALA,不少时间答了 ...

  9. ftk学习记录(IME文章)

    [声明:版权全部,欢迎转载.请勿用于商业用途. 联系信箱:feixiaoxing @163.com] 前面说的是全屏设置,还是请大家看一下效果图. watermark/2/text/aHR0cDovL ...

  10. SOA面向服务架构

    SOA面向服务架构 风尘浪子 只要肯努力,梦想总有一天会实现 随笔分类 - SOA面向服务架构 结合领域驱动设计的SOA分布式软件架构 摘要: 领域驱动设计DDD的总体结构,Repository层使用 ...