Java преобразовать структуру плоского массива в наём - PullRequest
0 голосов
/ 23 мая 2018

У меня есть 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 голосов
/ 23 мая 2018

Вы можете использовать Java 8 Stream s с 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()), который преобразует экземпляр TestVO в некоторый новый экземпляр класса, который содержит GrandParent, Parent и Child.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...