路径转化为tree的算法(a.b.c.d 和a.b.c.e和a.c.d)

xml报文的时候,设计人员要求按照xml中数据的tree样式进行展示,如图所示


前端的treetable的标签在easyUI中有,也曾尝试使用,因为我们用的elementUI,为保持同一性,最终放弃了easyUI中现成的treegrid标签,而elementUI是没有已经定义好的,所以大神帮忙写了一个,因为前段真的不是很熟悉,到此我也不太明白实现原理,

稍候会附上源码。

该treetable的data有一定的要求,那就是必须是层级关系明确的 就是原生的element中tree需要的格式

解析报文时可以通过递归实现构造该数据。  递归递归

但因为数据库表在设计时并未考虑到业务人员会改成该种模式,所以表中并未涉及到父子关系的标志字段,改表比较麻烦,所以改而将表中字段名,改为带路径的格式:以图中字段为例

即由原来的MsgId改为Fitoftpmtstsrpt.GrpHdr.MsgId

所以后期需要构造将字段根据名字进行层级构造

代码如下:为方便理解 代码一路到底,没有进行封装拆分

public static List<MsgNode> pathToTree(List<YmitMsgFld> flds) {
		List<MsgNode> tree = new ArrayList<>();
		HashSet<MsgNode> set = new HashSet<>();
		for (YmitMsgFld fld : flds) {
			String path = fld.getFldNm();
			while (path.contains(".")) {

				// 子节点的路径和名称
				int index = path.lastIndexOf(".");

				String name = path.substring(index + 1, path.length());

				MsgNode temNode = new MsgNode(path, name);

				// 父节点的路径和名称
				String parPaht = path.substring(0, index);

				int index2 = parPaht.lastIndexOf(".");

				String parName = parPaht.substring(index2 + 1, parPaht.length());

				MsgNode parNode = new MsgNode(parPaht, parName);

				if (set.contains(parNode)) {

					Iterator<MsgNode> iterator = set.iterator();

					while (iterator.hasNext()) {
						MsgNode tem = new MsgNode();
						tem = iterator.next();
						if (tem.getPath().equals(parNode.getPath())) {
							parNode = tem;
							break;
						}
					}
				} else {
					set.add(parNode);
				}

				if (set.contains(temNode)) {

					Iterator<MsgNode> iterator = set.iterator();

					while (iterator.hasNext()) {
						MsgNode tem = new MsgNode();
						tem = iterator.next();
						if (tem.getPath().equals(temNode.getPath())) {
							temNode = tem;
							break;
						}
					}
					if (null != parNode.getChildren()) {

						if (!parNode.getChildren().contains(temNode)) {
							parNode.getChildren().add(temNode);
						}
					} else {
						List<MsgNode> children = new ArrayList<>();
						children.add(temNode);
						parNode.setChildren(children);
					}

				} else {

					if (null != parNode.getChildren()) {
						parNode.getChildren().add(temNode);
					} else {
						List<MsgNode> children = new ArrayList<>();
						children.add(temNode);
						parNode.setChildren(children);
					}
					set.add(temNode);
				}
				path = parPaht;
			}

		}

		Iterator<MsgNode> iterator = set.iterator();

		while (iterator.hasNext()) {
			MsgNode tem = new MsgNode();
			tem = iterator.next();
			if (!tem.getPath().contains(".")) {
				tree.add(tem);
			}
		}
		return tree;
	}
package cn.com.yusys.ymit.domain;

import java.io.Serializable;
import java.util.List;

/**
 * @项目名称: 
 * @类名称: MsgNode
 * @类描述:
 * @功能描述:
 * @创建人: 
 * @创建时间: 2018-05-03 10:28
 * @修改备注:
 * @修改记录: 修改时间 修改人员 修改原因
 *        -------------------------------------------------------------
 * @version 1.0.0
 * @Copyright (c) 
 */
public class MsgNode implements Serializable {

	/**
	 * @属性名称: serialVersionUID
	 * @属性描述:
	 * @since 1.0.0
	 */
	private static final long serialVersionUID = 6334350503505500989L;

	private String pkId; // 字段ID,自增主键
	private String msgId; // 关联报文,对应报文的NODE_ID值
	private String fldNm; // 报文字段名称
	private String fldDesc; // 字段描述
	private String fldTyp; // 字段类型
	private String fldLen; // 数据长度
	private String isReq; // 是否必填,1为是,0为否
	private String defVal; // 默认值
	private String fixVal; // 修订值
	private String parNm; // 父节点名称
	private String path; // 节点路径
	private List<MsgNode> children = null;

	public MsgNode() {
	}

	public MsgNode(String path,String name) {

		this.path = path;

		this.fldNm = name;
	}

	public String getPkId() {
		return pkId;
	}

	public void setPkId(String pkId) {
		this.pkId = pkId;
	}

	public String getMsgId() {
		return msgId;
	}

	public void setMsgId(String msgId) {
		this.msgId = msgId;
	}

	public String getFldNm() {
		return fldNm;
	}

	public void setFldNm(String fldNm) {
		this.fldNm = fldNm;
	}

	public String getFldDesc() {
		return fldDesc;
	}

	public void setFldDesc(String fldDesc) {
		this.fldDesc = fldDesc;
	}

	public String getFldLen() {
		return fldLen;
	}

	public void setFldLen(String fldLen) {
		this.fldLen = fldLen;
	}

	public String getIsReq() {
		return isReq;
	}

	public void setIsReq(String isReq) {
		this.isReq = isReq;
	}

	public String getDefVal() {
		return defVal;
	}

	public void setDefVal(String defVal) {
		this.defVal = defVal;
	}

	public String getFixVal() {
		return fixVal;
	}

	public void setFixVal(String fixVal) {
		this.fixVal = fixVal;
	}

	public List<MsgNode> getChildren() {
		return children;
	}

	public void setChildren(List<MsgNode> children) {
		this.children = children;
	}

	public String getParNm() {
		return parNm;
	}

	public void setParNm(String parNm) {
		this.parNm = parNm;
	}

	public String getPath() {
		return path;
	}

	public void setPath(String path) {
		this.path = path;
	}

	public String getFldTyp() {
		return fldTyp;
	}

	public void setFldTyp(String fldTyp) {
		this.fldTyp = fldTyp;
	}

	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((path == null) ? 0 : path.hashCode());
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		MsgNode other = (MsgNode) obj;
		if (path == null) {
			if (other.path != null)
				return false;
		} else if (!path.equals(other.path))
			return false;
		return true;
	}

}



猜你喜欢

转载自blog.csdn.net/LIUHUA121/article/details/80334009