Вложенный родительский дочерний список с использованием Java 8 - PullRequest
0 голосов
/ 09 ноября 2019

У меня есть несколько родительских / дочерних пар, которые я хотел бы превратить в иерархические древовидные структуры, насколько это возможно, с помощью 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 + "]";
}

}
...