我有一堆父母/孩子对,我想使用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 + "]";
}
}