Java构建树状结构

/**
 * 节点实体类
 * @author Administrator
 *
 */
public class Nodes {

	private String id;
	
	//父节点
	private String pid;
	
	private String name;
	
	List<Nodes> childNodes;

	Nodes(String id,String pid,String name){
		this.id = id;
		this.pid = pid;
		this.name = name;
	}
	
	public String getId() {
		return id;
	}

	public void setId(String id) {
		this.id = id;
	}

	public String getPid() {
		return pid;
	}

	public void setPid(String pid) {
		this.pid = pid;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public List<Nodes> getChildNodes() {
		return childNodes;
	}

	public void setChildNodes(List<Nodes> childNodes) {
		this.childNodes = childNodes;
	}
	
}
/**
 * 树状结构生生成
 * @author Administrator
 *
 */
public class NodesUtils {

	//判断是否根节点,可根据实际情况修改
	public static boolean isRootElement(Nodes node){
		if(node.getPid().equals("0")){
			return true;
		}
		return false;
	}
	
	/**
	 * 获取子节点
	 * 递归获取子节点的子节点
	 * @param pid
	 * @param rootList
	 * @return
	 */
	public static List<Nodes> getChildNodes(String pid,List<Nodes> rootList){
		List<Nodes> childList = new ArrayList<>();
		for(Nodes n:rootList){
			if(n.getPid().equals(pid)){
				childList.add(n);
			}
		} 
		//递归查找子节点的子节点并赋值
		for(Nodes c:childList){
			c.setChildNodes(getChildNodes(c.getId(), rootList));
		}
              //子节点查找结束
		if(childList.size() == 0){
			return null;
		}
		return childList;
	}
	
	
	public static void main(String[] args) {
		List<Nodes> nodesList = new ArrayList<>();
		nodesList.add(new Nodes("1", "0", "1"));
		nodesList.add(new Nodes("1.1", "1", "1.1"));
		nodesList.add(new Nodes("1.2", "1", "1.2"));
		nodesList.add(new Nodes("1.2.1", "1.2", "1.2.1"));
		nodesList.add(new Nodes("1.2.1.1", "1.2.1", "1.2.1.1"));
		nodesList.add(new Nodes("1.3", "1", "1.3"));
		nodesList.add(new Nodes("1.4", "1", "1.4"));
		nodesList.add(new Nodes("1.3.1", "1.3", "1.3.1"));
		nodesList.add(new Nodes("1.4.1", "1.4", "1.4.1"));
		nodesList.add(new Nodes("1.4.1.1", "1.4。1", "1.4.1.1"));
		
		List<Nodes> rootlist = new ArrayList<>();
		//查找所有根节点
		for (Nodes n:nodesList) {
			if (isRootElement(n)) {
				rootlist.add(n);
			}
		}
		//根据根节点查找所有子节点
		for(Nodes nc:rootlist){
			nc.setChildNodes(getChildNodes(nc.getId(), nodesList));
		}
		//输出
		buildMenu(rootlist);
	    System.out.println(str);
	}

	/**
	 * 遍历菜单
	 * @param arr
	 * @return
	 */
	public static String str = "";
	public static String buildMenu(List<Nodes> arr){
		
        for(int i=0;i<arr.size();i++){
        	str += "<li>";
            str += "<a href='javascript:;'>" +
            			"<cite>"+arr.get(i).getId()+"</cite>" +
            			"<i class='iconfont nav_right'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"+arr.get(i).getName()+"</i>" +
            			"</a>";
            //存在子菜单 递归
        	if(arr.get(i).getChildNodes() != null && arr.get(i).getChildNodes().size() > 0){
        		str += "<ul>";
        		buildMenu(arr.get(i).getChildNodes()); // 递归
        		str += "</ul>";
        	}
        	str += "</li>";
        }   
        return str;
    }
}

 

$(function(){ $.fn.extend({ SimpleTree:function(options){ //初始化参数 var option = $.extend({ click:function(a){ } },options); option.tree=this; /* 在参数对象中添加对当前菜单树的引用,以便在对象中使用该菜单树 */ option._init=function(){ /* * 初始化菜单展开状态,以及分叉节点的样式 */ this.tree.find("ul ul").hide(); /* 隐藏所有子级菜单 */ this.tree.find("ul ul").prev("li").removeClass("open"); /* 移除所有子级菜单父节点的 open 样式 */ this.tree.find("ul ul[show='true']").show(); /* 显示 show 属性为 true 的子级菜单 */ this.tree.find("ul ul[show='true']").prev("li").addClass("open"); /* 添加 show 属性为 true 的子级菜单父节点的 open 样式 */ }/* option._init() End */ /* 设置所有超链接不响应单击事件 */ this.find("a").click(function(){ $(this).parent("li").click(); return false; }); /* 菜单项 接受单击 */ this.find("li").click(function(){ /* * 当单击菜单项 * 1.触发用户自定义的单击事件,将该 标签中的第一个超链接做为参数传递过去 * 2.修改当前菜单项所属的子菜单的显示状态(如果等于 true 将其设置为 false,否则将其设置为 true) * 3.重新初始化菜单 */ option.click($(this).find("a")[0]); /* 触发单击 */ /* * 如果当前节点下面包含子菜单,并且其 show 属性的值为 true,则修改其 show 属性为 false * 否则修改其 show 属性为 true */ /* if($(this).next("ul").attr("show")=="true"){ $(this).next("ul").attr("show","false"); }else{ $(this).next("ul").attr("show","true"); }*/ /* 初始化菜单 */ option._init(); }); /* 设置所有父节点样式 */ this.find("ul").prev("li").addClass("folder"); /* 设置节点“是否包含子节点”属性 */ this.find("li").find("a").attr("hasChild",false); this.find("ul").prev("li").find("a").attr("hasChild",true); /* 初始化菜单 */ option._init(); }/* SimpleTree Function End */ }); });
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值