• java 生成easyui 所需要的森林


      在项目中,可能会遇到机构树这种格式,但是数据库存储的数据 不能维护这样子的树,所以需要中间转换来完成,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节点是无效的,在返回结果集合的时候需要剔除掉

    运行结果:

      

  • 相关阅读:
    二分排序之三行代码
    最短路径—Floyd算法
    最小生成树 Kruskal算法
    最小生成树-Prim算法
    最短路径之迪杰斯特拉(Dijkstra)算法
    C函数指针
    Linux进程的实际用户ID和有效用户ID
    C++ 之Boost 实用工具类及简单使用
    ELK之消息队列选择redis_kafka_rabbitmq
    Python文件操作
  • 原文地址:https://www.cnblogs.com/tickobject/p/4161103.html
Copyright © 2020-2023  润新知