[英]java convert flat array structure to hirerarchical
我有以下值對象的java數組,格式如下
[
{grandParent1,parent1,child1},
{grandParent1,parent1,child2},
{grandParent1,parent2,child3},
{grandParent2,parent1,child4},
{grandParent2,parent2,child5},
{grandParent2,parent3,child6},
]
並且需要轉換為如下的層次結構
{
grandParent1
{
parent1
{
child1{
},
child2{
}
},
parent2
{
child3{
}
}
},
grandParent2
{
parent1
{
child4{
}
},
parent2
{
child5{
}
},
parent3
{
child6{
}
}
}
}
我們具有具有如下屬性的對象類的扁平結構值。
public class TestVO {
private String grandParent;
private String parent;
private String child;
public String getGrandParent() {
return grandParent;
}
public void setGrandParent(String grandParent) {
this.grandParent = grandParent;
}
public String getParent() {
return parent;
}
public void setParent(String parent) {
this.parent = parent;
}
public String getChild() {
return child;
}
public void setChild(String child) {
this.child = child;
}
}
請提出一些邏輯,這些邏輯將在Java對象中將平面轉換為分層結構時效率更高且性能更好。
更新我在每個祖父母,父母和孩子級別都有更多字段。 我們可以在邏輯上使用它嗎? 請找到以下更新對象的縮寫。 這里grandParentId,parentId和childId在每個級別上都是唯一的。
public class TestVO {
private String grandParentId;
private String grandParentFirstName;
private String grandParentLastName;
private String parentId;
private String parentFirstName;
private String parentLastName;
private String childId;
private String childFirstName;
private String childLastName;
}
您可以將Java 8 Stream
與groupingBy
收集器一起使用:
List<TestVO> list = ...
Map<String,Map<String,List<String>>>
map = list.stream()
.collect(Collectors.groupingBy(TestVO::getGrandParent,
Collectors.groupingBy(TestVO::getParent,
Collectors.mapping(TestVO::getChild,
Collectors.toList()))));
這將創建一個Map
其鍵是大父級,值是內部Map
,其中鍵是父級,值是對應的子級。
至於更新的問題,建議您為層次結構的每個級別( GrandParent
, Parent
和Child
創建一個類。 每個類將包含相應的3個屬性。 現在,如果將TestVO
更改為包含GrandParent
實例, Parent
實例和Child
實例而不是9個屬性,則可以使用與上面相同的代碼來生成Map<GrandParent,Map<Parent,List<Child>>>
。 您必須在GrandParent
和Parent
類中都重寫equals()
和hashCode()
。
如果無法按照建議更改輸入對象,則可以在上述Stream
管道中添加一個map()
步驟(在collect()
步驟之前),該步驟將TestVO
實例轉換為包含GrandParent
, Parent
和Child
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.