java将平面数组结构转换为HireArchical
我有如下格式的低于值对象的java数组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 {
[
{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)
步骤