Java 将平面列表转换为具有每个节点深度的树结构
我正在使用java,我需要将一个平面Java 将平面列表转换为具有每个节点深度的树结构,java,recursion,nested-loops,Java,Recursion,Nested Loops,我正在使用java,我需要将一个平面集转换为一个对象集,该对象集可以递归地包含其他对象列表 我从react前端接收此JSON数据: [ { name : "A", depth: "0", fullpath: "/A", subRows: null }, { name : "B", depth: &q
集
转换为一个对象集,该对象集可以递归地包含其他对象列表
我从react前端接收此JSON数据:
[
{
name : "A",
depth: "0",
fullpath: "/A",
subRows: null
},
{
name : "B",
depth: "0.0",
fullPath: "/A/B"
subRows: null
},
{
name : "C",
depth: "0.0.0",
fullPath: "/A/B/C",
subRows: null
},
{
name : "D",
depth: "1,
fullPath: "/D",
subRows: null
}
]
我想将其转换为这种结构(相同的数据,但具有父子关系):
对象中最重要的字段是定义结构的SUBWs数组,其他所有字段仅用于开发人员了解节点的深度和结构(例如,深度包含每个父节点的索引加上当前节点的索引,所有这些索引都用点分隔)
请不要太依赖完整路径,因为对象的名称不是唯一的
这些对象中的每一个都是行对象,在前端,所有行都创建一个表。以下Row.java模型类:
public class Row {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private int id;
private String name;
private String depth;
private String fullPath;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name="ID_PARENT")
@JsonIgnore
private Row parent;
@OneToMany(mappedBy="parent", fetch = FetchType.EAGER)
@org.hibernate.annotations.OrderBy(clause = "id")
private Set<Row> subRows = new LinkedHashSet<Row>();
public Row(){}
//Getter and Setter
}
公共类行{
@身份证
@GeneratedValue(策略=GenerationType.AUTO)
私有int-id;
私有字符串名称;
私有串深度;
私有字符串完整路径;
@manytone(fetch=FetchType.LAZY)
@JoinColumn(name=“ID\u PARENT”)
@杰索尼奥雷
私有行父级;
@OneToMany(mappedBy=“parent”,fetch=FetchType.EAGER)
@org.hibernate.annotations.OrderBy(clause=“id”)
private Set subRows=new LinkedHashSet();
公共行(){}
//接二连三
}
有人对如何做有想法吗?几天来,我一直在用我的头撞击它。下面是执行上述任务的sudo代码。你可能得处理一些棘手的案件。但主要思想是维护一个
待处理行的列表。对于此列表中的每一行,如果父节点已经存在于depthToRows
映射中,我们将把该行插入父节点的子窗口,并从pendingRows
中删除该行。我们需要重复此操作,直到pendingRows
为空
罗列//算法的输入
List pendingRows=新建LinkedList();
Map depthToRows=新的HashMap();
pendingRows.addAll(inRows);
而(!pendingRows.isEmpty()){
用于(行:英寸){
depthToRows.put(row.getDepth(),row);
//查找父深度对象
字符串[]arr=row.getDepth().split(“.”);
如果(arr.length>1){
String parentDepth=String.join(“.”,Arrays.copyOfRange(arr,0,arr.length-1));
if(null!=depthorows.get(parentDepth)){
get(parentDepth).getSubRows().add(行);
挂起行。删除(行);
}
}
}
}
C的深度不应该是0.0.0 iso 0.1.0吗?0.1.0似乎把它放在了BYou'的同一个级别。如果你是对的,我会纠正它,谢谢你的逻辑!非常感谢你真的救了我!
public class Row {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private int id;
private String name;
private String depth;
private String fullPath;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name="ID_PARENT")
@JsonIgnore
private Row parent;
@OneToMany(mappedBy="parent", fetch = FetchType.EAGER)
@org.hibernate.annotations.OrderBy(clause = "id")
private Set<Row> subRows = new LinkedHashSet<Row>();
public Row(){}
//Getter and Setter
}