java将平面数组结构转换为HireArchical

java将平面数组结构转换为HireArchical,java,arrays,algorithm,object,data-structures,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 {

我有如下格式的低于值对象的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对象中的平面结构转换为层次结构的高效且性能更好的逻辑

更新 我在每个祖父母、父母和孩子级别都有一些字段。我们能在逻辑上使用它吗。请查找以下更新对象的简短形式。在这里,祖父母ID、父母ID和孩子ID在每个级别都是唯一的

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
s与
groupingBy
collector一起使用:

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()))));
List=。。。
地图
map=list.stream()
.collect(Collectors.groupingBy)(TestVO::getGrandParent,
Collectors.groupingBy(TestVO::getParent,
Collectors.mapping(TestVO::getChild,
收藏家;
这将创建一个
Map
,其键是父级,其值是内部
Map
s,其中键是父级,值是相应的子级

至于您更新的问题,我建议您为层次结构的每个级别创建一个类-
祖父母
父母
子女
。每个类将包含相应的3个属性。现在,如果将
TestVO
更改为包含
祖辈
实例、
实例和
实例,而不是9个属性,则可以使用与上述相同的代码生成
映射
。您必须在
GrandParent
Parent
类中重写
equals()
hashCode()


如果不能按照建议更改输入对象,可以将
map()
步骤添加到上面的
管道(在
collect()
步骤之前),该管道将
TestVO
实例转换为包含
祖辈的某个新类实例,
Parent
Child

感谢您的帮助,但实际情况完全不同,这意味着我在每个祖父母、父母和孩子级别都有更多字段。我们能在逻辑上使用它吗。请查找以下更新对象的简短形式。这里的Id是唯一的。公共类TestVO{private String祖父母ID;private String祖父母firstname;private String祖父母lastname;private String parentFirstName;private String parentFirstName;private String childFirstName;private String childLastName;},谢谢你的帮助。我无法更改输入,所以尝试第二种方式。我以分层方式创建了新类TestHierarchy>TestGrandrent->TestParent->TestChild,并添加了如下映射。映射(TestHierarchy)。它显示的错误是map=list.stream().map(TestHierarchy).collect(..)您能帮助如何在那里添加MAPI而不是字符串吗?请使用它objects@sardarCoder创建一个类(我们称之为
TestClasses
)它包含一个祖辈实例、一个父实例和一个子实例,为该类定义一个接受
TestVO
对象的构造函数,并在
collect
之前添加一个
map(TestClasses::new)
步骤