在项目中,可能会遇到机构树这种格式,但是数据库存储的数据 不能维护这样子的树,所以需要中间转换来完成,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. Oracle 多行转多列

    Oracle 多行转多列,列值转为列名   前段时间做调查问卷,客户创建自定义问卷内容,包括题目和选项内容; 之后需要到处问卷明细,,,,麻烦来咯 于是到网上到处搜索,没有直接结果;于是又找各种相似的 ...

  2. PHP Yii框架开发——组织架构网站重构

    最近一段时间在维护公司的组织架构网站(Org),旧版网站只是用了xampp简单搭建了一套环境部署在了windows机器上,代码结构相对简单. 整个架构如下: 整个架构没有用到复杂的结构,class里放 ...

  3. Winform 实现像菜单一样弹出层

    原文:Winform 实现像菜单一样弹出层 在实际工作中,如果能像菜单一样弹出自定义内容,会方便很多,比如查询时,比如下拉列表显示多列信息时,比如在填写某个信息需要查看一些信息树时.这个时候自定义弹出 ...

  4. ubuntu下一个rootusername入口mysql,如何查看username和password,如何改变rootpassword

    mysql -u root -p 按Enter键,提示时输入密码access denied......ues password YES/NO错误. 第一步: 然后,你需要输入/etc/mysql夹.然 ...

  5. javascript 的Date 格式化, 模仿shell中date命令的格式

    原文:javascript 的Date 格式化, 模仿shell中date命令的格式 shell 中显示当前的日期 [root@localhost]$ date '+%Y-%m-%d %H:%M:%S ...

  6. JAVA转让JS功能

    今天,在发展中使用js和Java互动.通常我们使用更多的是js转让Java方法.可以使用dwr.Ajax.jquery.突然发现Java转让js然后,我真的没见过,今天,互联网提供以下信息,顺便总结: ...

  7. AlloyRenderingEngine

    AlloyRenderingEngine燃烧的进度条 写在前面 Github: https://github.com/AlloyTeam/AlloyGameEngine HTML 5新增了progre ...

  8. 经典算法题每日演练——第八题 AC自动机

    原文:经典算法题每日演练--第八题 AC自动机 上一篇我们说了单模式匹配算法KMP,现在我们有需求了,我要检查一篇文章中是否有某些敏感词,这其实就是多模式匹配的问题. 当然你也可以用KMP算法求出,那 ...

  9. (c#)SKYPE API项目总结(一)

    原文:(c#)SKYPE API项目总结(一) 这个项目的需求:SKYPE软件文字聊天同步翻译,并将翻译后的内容会发送给对方,将对方发给自己的话翻译成自己语种.功能见图:               ...

  10. mysql_常用命令

    1: 以指定编码创建数据库 CREATE DATABASE `search_data` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci