在项目中,可能会遇到机构树这种格式,但是数据库存储的数据 不能维护这样子的树,所以需要中间转换来完成,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. asp.net学习之 数据绑定控件--表格绑定控件

    原文:asp.net学习之 数据绑定控件--表格绑定控件     数据绑定 Web 服务器控件是指可绑定到数据源控件,以实现在 Web 应用程序中轻松显示和修改数据的控件.数据绑定 Web 服务器控件 ...

  2. eclipse 构造 C++ 11 -- ubuntu 12.04

    设备g++ 4.8 sudo apt-get install python-software-properties sudo add-apt-repository ppa:ubuntu-toolcha ...

  3. 发布一个参考ssdb,使用go类似的实现redis高性能nosql:ledisdb

    起因 ledisdb是一个參考ssdb.採用go实现,底层基于leveldb,相似redis的高性能nosql数据库,提供了kv,list,hash以及zset数据结构的支持. 我们如今的应用极大的依 ...

  4. 第13章 模版方法模式(Template Method)

    原文  第13章 模版方法模式(Template Method) 模板模式 模板模式 举例:模拟下数据库的update方法,先删除在插入. 1 2 3 4 5 6 7 8 9 10 11 12 13 ...

  5. 零基Github Page个人博客建立教程无限的自由流动

    本文介绍了什么是Github Page.以及如何使用Github Page搭建一个免费的.无限流量的个人博客并绑定独立域名. 一.前言 1.1 为什么要用Github Page搭建博客 借用阮一峰老大 ...

  6. 解决Unity3d 4.3 动画系统带来的烦恼

    近期有非常多同学问我关于unity3d 4.3更新之后动画系统和曾经不一样了,并且之前用的非常熟练的创建动画和修修改画非常多操作都不好用了,那么在这里和大家分享一下三杀的个人经验,方便大家使用unit ...

  7. 前端学习笔记(zepto或jquery)—— 布局技巧(一)

    html5中有一些标签我们很难改变其样式,例如input=file,select等.这个时候我们需要改变一下思路,将原有透明度置为0,借助于div或span等以控制样式的标签来代替. 效果图: < ...

  8. SQLServer 使用 @@ERROR

    原文:SQLServer 使用 @@ERROR 使用 @@ERROR 如果最后的 Transact-SQL 语句执行成功,则 @@ERROR 系统函数返回 0:如果此语句产生错误,则 @@ERROR ...

  9. HDU 3639 Hawk-and-Chicken(Tarjan缩点+反向DFS)

    Problem Description Kids in kindergarten enjoy playing a game called Hawk-and-Chicken. But there alw ...

  10. poj 2513 Colored Sticks(欧拉路径+并检查集合+特里)

    题目链接:poj 2513 Colored Sticks 题目大意:有N个木棍,每根木棍两端被涂上颜色.如今给定每一个木棍两端的颜色.不同木棍之间拼接须要颜色同样的 端才干够.问最后是否能将N个木棍拼 ...