使用Java 8的嵌套父子列表

我有一堆父母/孩子对,我想使用Java 8变成分层的树状结构。例如,这些可能是配对:

Child : Parent
    H : Ga
    F : G
    G : D
    E : D
    A : E
    B : C
    C : E
    D : NULL
    Z : Y
    Y : X
    X: NULL

哪些需要转换为(一个或多个)层次树:

D
├── E
│   ├── A
│   │   └── B
│   └── C   
└── G
|   ├── F
|   └── H
|
X
|
└── Y
    |
    └──Z

我最初尝试在循环中对其进行迭代,然后将结果分配给BO手动检查是否可以使用Java 8功能轻松完成

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class Main2 {

public static void main(String[] args) {

    // input
    ArrayList<Pair> pairs = new ArrayList<Pair>();
    pairs.add(new Pair( "H","G"));
    pairs.add(new Pair( "F","G"));
    pairs.add(new Pair( "G","D"));
    // ...


    // Arrange
    // String corresponds to the Id
    Map<String,MegaMenuDTO> hm = new HashMap<>();


    // you are using MegaMenuDTO as Linked list with next and before link 

    // populate a Map
    for(Pair p:pairs){

        //  ----- Child -----
        MegaMenuDTO mmdChild ;
        if(hm.containsKey(p.getchildId())){
            mmdChild = hm.get(p.getchildId());
        }
        else{
            mmdChild = new MegaMenuDTO();
            hm.put(p.getchildId(),mmdChild);
        }           
        mmdChild.setId(p.getchildId());
        mmdChild.setParentId(p.getParentId());
        // no need to set ChildrenItems list because the constructor created a new empty list



        // ------ Parent ----
        MegaMenuDTO mmdparent ;
        if(hm.containsKey(p.getParentId())){
            mmdparent = hm.get(p.getParentId());
        }
        else{
            mmdparent = new MegaMenuDTO();
            hm.put(p.getParentId(),mmdparent);
        }
        mmdparent.setId(p.getParentId());
        mmdparent.setParentId("null");                              
        mmdparent.addChildrenItem(mmdChild);


    }

    // Get the root
    List<MegaMenuDTO> DX = new ArrayList<MegaMenuDTO>(); 
    for(MegaMenuDTO mmd : hm.values()){
        if(mmd.getParentId().equals("null"))
            DX.add(mmd);
    }

    // Print 
    for(MegaMenuDTO mmd: DX){
        System.out.println("DX contains "+DX.size()+" that are : "+ mmd);
    }

}

}

**Pair class:**

public class Pair {
private String childId ;
private String childCode;
private String parentCode;

public Pair(String childCode,String parentCode) {
    this.childCode = childCode;
    this.parentCode = parentCode;
}
public String getchildId() {
    return childId;
}
public void setChildId(String childId) {
    this.childId = childId;
}
public String getchildCode() {
    return childCode;
}
public void setChildCode(String childCode) {
    this.childCode = childCode;
}
public String getParentCode() {
    return parentCode;
}
public void setParentCode(String parentCode) {
    this.parentCode = parentCode;
}

}

**MegaMenuDTO Class** 

import java.util.ArrayList;
import java.util.List;

public class MegaMenuDTO {

private String Id;
private String name;
private String parentCode;
private String title;
private List<MegaMenuDTO> childrenItems; 

public MegaMenuDTO() {
    this.Id = "";
    this.name = "";     
    this.parentId = "";
    this.childrenItems = new ArrayList<MegaMenuDTO>();
}

public String getId() {
    return Id;
}
public void setId(String id) {
    Id = id;
}
public String getName() {
    return name;
}
public void setName(String name) {
    this.name = name;
}
public String getParentCode() {
    return parentCode;
}
public void setParentCode(String parentCode) {
    this.parentCode = parentCode;
}
 public String getTitle() {
    return title;
}
public void setTitle(String title) {
    this.title = title;
}
public List<MegaMenuDTO> getchildrenItems() {
    return childrenItems;
}
public void setChildrenItems(List<MegaMenuDTO> childrenItems) {
    this.childrenItems = childrenItems;
}
public void addChildrenItem(MegaMenuDTO childrenItem){
    if(!this.childrenItems.contains(childrenItem))
        this.childrenItems.add(childrenItem);
}

@Override
public String toString() {
    return "MegaMenuDTO [Id=" + Id + ",name=" + name + ",parentId="
            + parentId + ",childrenItems=" + childrenItems + "]";
}

}
rayest 回答:使用Java 8的嵌套父子列表

暂时没有好的解决方案,如果你有好的解决方案,请发邮件至:iooj@foxmail.com
本文链接:https://www.f2er.com/3134651.html

大家都在问