簡體   English   中英

java將平面數組結構轉換為hirerarchical

[英]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 StreamgroupingBy收集器一起使用:

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 ,其中鍵是父級,值是對應的子級。

至於更新的問題,建議您為層次結構的每個級別( GrandParentParentChild創建一個類。 每個類將包含相應的3個屬性。 現在,如果將TestVO更改為包含GrandParent實例, Parent實例和Child實例而不是9個屬性,則可以使用與上面相同的代碼來生成Map<GrandParent,Map<Parent,List<Child>>> 您必須在GrandParentParent類中都重寫equals()hashCode()

如果無法按照建議更改輸入對象,則可以在上述Stream管道中添加一個map()步驟(在collect()步驟之前),該步驟將TestVO實例轉換為包含GrandParentParentChild

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM