在项目中,可能会遇到机构树这种格式,但是数据库存储的数据 不能维护这样子的树,所以需要中间转换来完成,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. 【SSH三框架】Hibernate基金会七:许多附属业务

    相对于上述一关系,在这里,下一个一对多关系说明. 另外,在上述.我们描述了许多人描述的一一对应关系.在关系数据库是多对一的关系.但也有许多关系. 但,只知道它是不够的,Hibernate它是一种面向对 ...

  2. ES6 扫盲

    原文地址:ECMAScript 6 扫盲--小胡子 1. let.const 和 block 作用域 let 允许创建块级作用域,ES6 推荐在函数中使用 let 定义变量,而非 var: var a ...

  3. 改动ubuntu/linux文件夹显示颜色

    通过secureCRT登陆linux,假设背景颜色选为黑色,非常可能在使用ls命令时看不清楚文件夹名,这时候我们能够通过一个简单的方式将文件夹变为一个显眼的颜色,比如"黄色". [ ...

  4. XML的序列化和反序列化 详细介绍

    为什么要做序列化和反序列化? 一个回答: 我们都知道对象是不能在网络中直接传输的,不过还有补救的办法.XML(Extensible Markup Language)可扩展标记语言,本身就被设计用来存储 ...

  5. java_Timer_schedule jdk自带定时器

    定时器经常在项目中用到,定制执行某些操作,比如爬虫就需要定时加载种子等操作,之前一直用spring的定制器近期做项目发现,jdk有很简单的提供 代码如下 1 /* * Copyright (c) 20 ...

  6. Redhat Linux挂载NTFS格式的移动硬盘

    Redhat Linux挂载NTFS格式的移动硬盘 1. 选择下载ntfs-3g的源码包或rpm包 http://www.tuxera.com/community/open-source-ntfs-3 ...

  7. linux 虚拟文件系统

    转自:https://www.ibm.com/developerworks/cn/linux/l-cn-vfs/ Linux 允许众多不同的文件系统共存,并支持跨文件系统的文件操作,这是因为有虚拟文件 ...

  8. 圣魔大战3(Castle Fantisia)艾伦希亚战记改动器/秘籍——究极改动大法

    艾伦西亚战记== 艾伦希亚战记,是一个游戏 武器:UltraEdit(金山游侠自带的文件改动器也能够,仅仅是这个专业) 目标: 存档文件(建议先备份)  知识:save00.dat-save19.da ...

  9. jquery_mobile.js+html5+css3打造手机平板等各种效果

    http://www.w3school.com.cn/jquerymobile/jquerymobile_events_orientation.asp

  10. Lua的多任务机制——协程(coroutine)

    并发是现实世界的本质特征,而聪明的计算机科学家用来模拟并发的技术手段便是多任务机制.大致上有这么两种多任务技术,一种是抢占式多任务(preemptive multitasking),它让操作系统来决定 ...