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

我正在使用java,我需要将一个平面
转换为一个对象集,该对象集可以递归地包含其他对象列表

我从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
}