我有以下值对象的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;
}
答案 0 :(得分:0)
您可以将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
s,其中键是父项,值是相应的子项。
至于您更新的问题,我建议您为层次结构的每个级别创建一个类 - GrandParent
,Parent
和Child
。每个类将包含相应的3个属性。现在,如果您将TestVO
更改为包含GrandParent
实例,Parent
实例和Child
实例而不是9个属性,则可以使用与上述相同的代码生成Map<GrandParent,Map<Parent,List<Child>>>
。您必须在equals()
和hashCode()
类中覆盖GrandParent
和Parent
。
如果您无法按照建议更改输入对象,则可以向上述map()
管道(Stream
步骤之前)添加collect()
步骤,以转换{{1实例到一个包含TestVO
,GrandParent
和Parent
的新类实例。