java将平面数组结构转换为一个分段

时间:2018-05-23 07:37:14

标签: java arrays algorithm object data-structures

我有以下值对象的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;
}

1 个答案:

答案 0 :(得分:0)

您可以将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 s,其中键是父项,值是相应的子项。

至于您更新的问题,我建议您为层次结构的每个级别创建一个类 - GrandParentParentChild。每个类将包含相应的3个属性。现在,如果您将TestVO更改为包含GrandParent实例,Parent实例和Child实例而不是9个属性,则可以使用与上述相同的代码生成Map<GrandParent,Map<Parent,List<Child>>>。您必须在equals()hashCode()类中覆盖GrandParentParent

如果您无法按照建议更改输入对象,则可以向上述map()管道(Stream步骤之前)添加collect()步骤,以转换{{1实例到一个包含TestVOGrandParentParent的新类实例。