java编程两种树形菜单结构的转换代码

首先看看两种树形菜单结构的代码示例。

SingleTreeNode:

package com.zzj.tree;
public class SingleTreeNode {
	private int id;
	private int pId;
	private String name;
	public SingleTreeNode() {
	}
	public SingleTreeNode(int id, int pId, String name) {
		this.id = id;
		this.pId = pId;
		this.name = name;
	}
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public int getpId() {
		return pId;
	}
	public void setpId(int pId) {
		this.pId = pId;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	@Override
	  public String toString() {
		return "SingleTreeNode [id=" + id + ", pId=" + pId + ", name=" + name + "]";
	}
}

这种结构很适合存储到关系型数据库中。

MultiTreeNode:

package com.zzj.tree;
import java.util.List;
public class MultiTreeNode {
	private int id;
	private String name;
	private List<MultiTreeNode> children;
	public MultiTreeNode() {
	}
	public MultiTreeNode(int id, String name) {
		this.id = id;
		this.name = name;
	}
	public MultiTreeNode(int id, String name, List<MultiTreeNode> children) {
		this.id = id;
		this.name = name;
		this.children = children;
	}
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public List<MultiTreeNode> getChildren() {
		return children;
	}
	public void setChildren(List<MultiTreeNode> children) {
		this.children = children;
	}
	@Override
	  public String toString() {
		return "MultiTreeNode [id=" + id + ", name=" + name + ", children=" + children + "]";
	}
}

两种转换器

ToMultiTreeTransformer:

package com.zzj.tree;
import java.util.ArrayList;
import java.util.List;
public class ToMultiTreeTransformer {
	private List<SingleTreeNode> singleTreeNodes;
	private List<MultiTreeNode> multiTreeNodes = new ArrayList<>();
	public ToMultiTreeTransformer(List<SingleTreeNode> singleTreeNodes) {
		this.singleTreeNodes = singleTreeNodes;
	}
	public List<MultiTreeNode> transform(){
		// 先找出所有的根节点
		for (int i = 0; i < singleTreeNodes.size(); i++) {
			SingleTreeNode singleTreeNode = singleTreeNodes.get(i);
			Boolean isRoot = true;
			for (int j = 0; j < singleTreeNodes.size(); j++) {
				SingleTreeNode temp = singleTreeNodes.get(j);
				if (singleTreeNode.getpId() == temp.getId()) {
					isRoot = false;
					break;
				}
			}
			if (isRoot) {
				MultiTreeNode multiTreeNode = new MultiTreeNode(singleTreeNode.getId(),
				            singleTreeNode.getName());
				multiTreeNodes.add(multiTreeNode);
			}
		}
		// 设置子节点
		for (int i = 0; i < multiTreeNodes.size(); i++) {
			MultiTreeNode multiTreeNode = multiTreeNodes.get(i);
			setChildren(multiTreeNode);
		}
		return multiTreeNodes;
	}
	/**
   * 设置子节点
   * @param multiTreeNode
   */
	private void setChildren(MultiTreeNode multiTreeNode){
		for (int j = 0; j < singleTreeNodes.size(); j++) {
			SingleTreeNode temp = singleTreeNodes.get(j);
			if (temp.getpId() == multiTreeNode.getId()) {
				MultiTreeNode child = new MultiTreeNode(temp.getId(),
				            temp.getName());
				List<MultiTreeNode> children = multiTreeNode.getChildren();
				if (children == null) {
					children = new ArrayList<>();
					multiTreeNode.setChildren(children);
				}
				children.add(child);
				setChildren(child);
			}
		}
	}
}

ToSingleTreeTransformer:

package com.zzj.tree;
import java.util.ArrayList;
import java.util.List;
public class ToSingleTreeTransformer {
	private List<MultiTreeNode> multiTreeNodes;
	private List<SingleTreeNode> singleTreeNodes = new ArrayList<>();
	public ToSingleTreeTransformer(List<MultiTreeNode> multiTreeNodes) {
		this.multiTreeNodes = multiTreeNodes;
	}
	public List<SingleTreeNode> transform(){
		// 先获取根节点
		for (int i = 0; i < multiTreeNodes.size(); i++) {
			MultiTreeNode multiTreeNode = multiTreeNodes.get(i);
			SingleTreeNode singleTreeNode = new SingleTreeNode(multiTreeNode.getId(),
			          0, multiTreeNode.getName());
			singleTreeNodes.add(singleTreeNode);
		}
		// 获取子节点
		for (int i = 0; i < multiTreeNodes.size(); i++) {
			MultiTreeNode multiTreeNode = multiTreeNodes.get(i);
			getChildren(multiTreeNode);
		}
		return singleTreeNodes;
	}
	/**
   * 获取子节点
   * @param multiTreeNode
   */
	private void getChildren(MultiTreeNode multiTreeNode){
		for (int i = 0; i < singleTreeNodes.size(); i++) {
			SingleTreeNode temp = singleTreeNodes.get(i);
			if (multiTreeNode.getId() == temp.getId()) {
				List<MultiTreeNode> children = multiTreeNode.getChildren();
				if (children != null) {
					for (int j = 0; j < children.size(); j++) {
						MultiTreeNode child = children.get(j);
						SingleTreeNode singleTreeNode = new SingleTreeNode(child.getId(),
						                multiTreeNode.getId(), child.getName());
						singleTreeNodes.add(singleTreeNode);
						getChildren(child);
					}
				}
			}
		}
	}
}

测试

package com.zzj.tree;
import java.util.ArrayList;
import java.util.List;
public class TreeTransformerTest {
	private final static List<SingleTreeNode> SINGLE_TREE = new ArrayList<SingleTreeNode>();
	static {
		SingleTreeNode China = new SingleTreeNode(1, 0, "中国");
		SINGLE_TREE.add(China);
		SingleTreeNode Hunan = new SingleTreeNode(2, 1, "湖南");
		SINGLE_TREE.add(Hunan);
		SingleTreeNode Changsha = new SingleTreeNode(3, 2, "长沙");
		SINGLE_TREE.add(Changsha);
		SingleTreeNode Hubei = new SingleTreeNode(4, 1, "湖北");
		SINGLE_TREE.add(Hubei);
		SingleTreeNode Wuhan = new SingleTreeNode(5, 4, "武汉");
		SINGLE_TREE.add(Wuhan);
		SingleTreeNode America = new SingleTreeNode(6, 0, "美国");
		SINGLE_TREE.add(America);
		SingleTreeNode California = new SingleTreeNode(7, 6, "加利福尼亚");
		SINGLE_TREE.add(California);
		SingleTreeNode LosAngeles = new SingleTreeNode(8, 7, "洛杉矶");
		SINGLE_TREE.add(LosAngeles);
	}
	public static void main(String[] args) throws Exception {
		ToMultiTreeTransformer multiTreeTransformer = new ToMultiTreeTransformer(SINGLE_TREE);
		List<MultiTreeNode> multiTreeNodes = multiTreeTransformer.transform();
		System.out.println(multiTreeNodes);
		ToSingleTreeTransformer singleTreeTransformer = new ToSingleTreeTransformer(multiTreeNodes);
		List<SingleTreeNode> singleTreeNodes = singleTreeTransformer.transform();
		System.out.println(singleTreeNodes);
	}
}

输出结果:

[MultiTreeNode [id=1, name=中国, children=[MultiTreeNode [id=2, name=湖南, children=[MultiTreeNode [id=3, name=长沙, children=null]]], MultiTreeNode [id=4, name=湖北, children=[MultiTreeNode [id=5, name=武汉, children=null]]]]], MultiTreeNode [id=6, name=美国, children=[MultiTreeNode [id=7, name=加利福尼亚, children=[MultiTreeNode [id=8, name=洛杉矶, children=null]]]]]]
[SingleTreeNode [id=1, pId=0, name=中国], SingleTreeNode [id=6, pId=0, name=美国], SingleTreeNode [id=2, pId=1, name=湖南], SingleTreeNode [id=3, pId=2, name=长沙], SingleTreeNode [id=4, pId=1, name=湖北], SingleTreeNode [id=5, pId=4, name=武汉], SingleTreeNode [id=7, pId=6, name=加利福尼亚], SingleTreeNode [id=8, pId=7, name=洛杉矶]] 

总结

以上就是本文关于java编程两种树形菜单结构的转换代码的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站:

Java实现生成Excel树形表头完整代码示例

Java语言描述二叉树的深度和宽度

java算法实现红黑树完整代码示例

如有不足之处,欢迎留言指出!

(0)

相关推荐

  • Java递归如何正确输出树形菜单

    本文实例为大家分享了java递归输出树形菜单的具体代码,供大家参考,具体内容如下 首先我们要建立树节点的类: package com.tree; public class Node { private Integer id; private Integer parentId; private String name; private String link; public Integer getId() { return id; } public void setId(Integer id) {

  • Java树形菜单的创建

    功能:实现创建一个树形菜单 说明:创建树形菜单结构与创建菜单栏类似,是按层次与模型创建的. 通过DefaultMutableTreeNode类创建根节点.子节点和孙节点对象,再通过DefaultTreeModel 类利用根节点创建树模型对象,然后通过treeModel.insertNodeInto方法将节点对象插入树模型中. 效果图: 代码: import java.awt.*; import javax.swing.*; import javax.swing.tree.*; import ja

  • java实现遍历树形菜单两种实现代码分享

    文本主要向大家分享了java实现遍历树形菜单的实例代码,具体如下. OpenSessionView实现: package org.web; import java.io.IOException; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.se

  • java实现构造无限层级树形菜单

    这里来讲一下后台java如何构造多叉树,这样前台就可接收到数据递归构造树形菜单了. 我们来理一下如何实现构造多叉树的逻辑吧,其实整个问题概括起来就是 1.构造一个实体类,用来存储节点,所以我们构造的需要四个对象(id,pid,name,和chirenList) 2.构造菜单结构 3.构造子菜单,如此循环,通过pid判断上级菜单 具体实现: 1.这里构造Tree.java实体类 package com.tcl.jr.crm.entity; /** * 类名称:Tree * 类描述:树形结构 */

  • Java构建树形菜单的实例代码(支持多级菜单)

    效果图:支持多级菜单. 菜单实体类: public class Menu { // 菜单id private String id; // 菜单名称 private String name; // 父菜单id private String parentId; // 菜单url private String url; // 菜单图标 private String icon; // 菜单顺序 private int order; // 子菜单 private List<Menu> children;

  • java编程两种树形菜单结构的转换代码

    首先看看两种树形菜单结构的代码示例. SingleTreeNode: package com.zzj.tree; public class SingleTreeNode { private int id; private int pId; private String name; public SingleTreeNode() { } public SingleTreeNode(int id, int pId, String name) { this.id = id; this.pId = pI

  • 浅谈Java的两种多线程实现方式

    本文介绍了浅谈Java的两种多线程实现方式,分享给大家.具有如下: 一.创建多线程的两种方式 Java中,有两种方式可以创建多线程: 1 通过继承Thread类,重写Thread的run()方法,将线程运行的逻辑放在其中 2 通过实现Runnable接口,实例化Thread类 在实际应用中,我们经常用到多线程,如车站的售票系统,车站的各个售票口相当于各个线程.当我们做这个系统的时候可能会想到两种方式来实现,继承Thread类或实现Runnable接口,现在看一下这两种方式实现的两种结果. 程序1

  • Java HashMap两种简便排序方法解析

    这篇文章主要介绍了Java HashMap两种简便排序方法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 HashMap的储存是没有顺序的,而是按照key的HashCode实现. key=手机品牌,value=价格,这里以这个例子实现按名称排序和按价格排序. Map phone=new HashMap(); phone.put("Apple",8899); phone.put("SAMSUNG",7000);

  • java jvm两种存储区的类型知识点讲解

    我们知道在jvm中存放了不少数据,那么存放数据的地方叫做存储区.想必大家还不知道存储区是分为两种类型的,常量缓冲池和方法区.相信很多人还没有接触到这个概念,本篇对java中jvm的存储区进行的内容的整理,下面一起来看看这两种存储取的概念和区别吧. 1.分类 JVM有两种类型的存储区:常量缓冲池和方法区.常量缓冲池用于存储类名.方法名和字段名以及字符串常量.方法区用于存储Java方法的字节码.JVM规范中没有规定这两个存储区域的具体实现.因此,Java应用程序的存储布局必须在运行过程中确定,这取决

  • 详解Java中两种分页遍历的使用姿势

    在日常开发中,分页遍历迭代的场景可以说非常普遍了,比如扫表,每次捞100条数据,然后遍历这100条数据,依次执行某个业务逻辑:这100条执行完毕之后,再加载下一百条数据,直到扫描完毕 那么要实现上面这种分页迭代遍历的场景,我们可以怎么做呢 本文将介绍两种使用姿势 常规的使用方法 借助Iterator的使用姿势 1. 数据查询模拟 首先mock一个分页获取数据的逻辑,直接随机生成数据,并且控制最多返回三页 public static int cnt = 0; private static List

  • java编程实现并查集的路径压缩代码详解

    首先看两张路径压缩的图片: 并查集(Union-find Sets)是一种非常精巧而实用的数据结构,它主要用于处理一些不相交集合的合并问题.一些常见的用途有求连通子图.求最小生成树的 Kruskal 算法和求最近公共祖先(Least Common Ancestors, LCA)等. 使用并查集时,首先会存在一组不相交的动态集合 S={S 1 ,S 2 ,⋯,S k } ,一般都会使用一个整数表示集合中的一个元素. 每个集合可能包含一个或多个元素,并选出集合中的某个元素作为代表.每个集合中具体包含

  • Java编程实现轨迹压缩之Douglas-Peucker算法详细代码

    第一部分 问题描述 1.1 具体任务 本次作业任务是轨迹压缩,给定一个GPS数据记录文件,每条记录包含经度和维度两个坐标字段,所有记录的经纬度坐标构成一条轨迹,要求采用合适的压缩算法,使得压缩后轨迹的距离误差小于30m. 1.2 程序输入 本程序输入是一个GPS数据记录文件. 1.3 数据输出 输出形式是文件,包括三部分,压缩后点的ID序列及坐标.点的个数.平均距离误差.压缩率 第二部分 问题解答 根据问题描述,我们对问题进行求解,问题求解分为以下几步: 2.1 数据预处理 本次程序输入为GPS

  • Java编程实现对十六进制字符串异或运算代码示例

    前言:好久没有写博客,最近一年感觉真是好忙,各种做不完的工作.相信很多上班族都会有这种感觉.最近对NFC进行写卡操作,需要计算一个校验位.一般情况下,校验位多数是由前几个字节进行异或运算所得. 现在我就先说一下我使用的场景: 把一个16字节的数据写到CPU卡(如交通卡)里面,最后一字节是校验码---前十五字节异或. 我开始从网上找了一些别人写的算法发现计算后结果不对,或者就是写的太复杂了,于是自己就写了一个,感觉也比较简单,现在分享给大家,希望一起交流一下. 第一节:什么是异或运算(主要摘自百度

  • Java编程二项分布的递归和非递归实现代码实例

    本文研究的主要内容是Java编程二项分布的递归和非递归实现,具体如下. 问题来源: 算法第四版 第1.1节 习题27:return (1.0 - p) * binomial(N - 1, k, p) + p * binomial(N - 1, k - 1, p); 计算递归调用次数,这里的递归式是怎么来的? 二项分布: 定义:n个独立的是/非试验中成功次数k的离散概率分布,每次实验成功的概率为p,记作B(n,p,k). 概率公式:P(ξ=K)= C(n,k) * p^k * (1-p)^(n-k

  • Java编程数组中最大子矩阵简便解法实现代码

    本文研究的主要是Java编程数组中最大子矩阵的相关内容,具体介绍如下. 遇到一个好人,可以改变一生:遇到一本好书,又何尝不是呢? 最近在翻阅 左程云先生的<程序员代码面试指南–IT名企算法与数据结构题目最优解>时就非常的有感悟.建议有这方面爱好的博友,也去观摩观摩. 书中讲解的基于栈的数组的最大矩阵的算法很经典,但是博主能力有限,没能彻底的领悟该算法的精髓,但是根据这个思想,博主想出了一种简易的应对该类问题的算法,现概述如下. 核心思想 先来看一张图吧,我们就可以大致的理解了. 如图,每一个轮

随机推荐