Как построить n-арное дерево на основе его предзаказного обхода, если заданы уровни иерархииJAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Как построить n-арное дерево на основе его предзаказного обхода, если заданы уровни иерархии

Сообщение Anonymous »

Мне предоставляется ответ в формате JSON, где предварительный обход n-арного дерева указан в JSONArray. Мне нужно преобразовать его в древовидную структуру и отправить обратно в ответ.
ДАН ответ

Код: Выделить всё

{
"ControllingArea" : "TZUS",
"TopNodes" : false,
"Language" : "EN",
"TONODES" : [
{
"Groupname" : "INC",
"Hierlevel" : 0,
"Valcount" : 0,
"Descript" : "INC"
},
{
"Groupname" : "INC-BBSR",
"Hierlevel" : 1,
"Valcount" : 0,
"Descript" : "INC1"
},
{
"Groupname" : "INC-STPI",
"Hierlevel" : 2,
"Valcount" : 0,
"Descript" : "INC2"
},
{
"Groupname" : "INC-FORT",
"Hierlevel" : 2,
"Valcount" : 0,
"Descript" : "INC3"
},
{
"Groupname" : "INC-BBL",
"Hierlevel" : 1,
"Valcount" : 0,
"Descript" : "INC4"
},
{
"Groupname" : "INC-PUNE",
"Hierlevel" : 1,
"Valcount" : 0,
"Descript" : "INC5"
}
],
"TOVALUE" : [
{
"Valfrom" : "",
"Valto" : ""
}
]
}
Здесь TONODES представляют собой обход предварительного порядка в дереве, ТАКЖЕ уровень иерархии указывается в объектах, к какому уровню он принадлежит.дерево должно выглядеть так (представление пользовательского интерфейса).
изображение дерева
Ответ, который я хочу отправить, должен выглядеть так:

Код: Выделить всё

{
"INC": {
"Groupname": "INC",
"Hierlevel": 0,
"Valcount": 0,
"Descript": "INC",
"INC-BBSR": {
"Groupname": "INC-BBSR",
"Hierlevel": 1,
"Valcount": 0,
"Descript": "INC1",
"INC-STPI": {
"Groupname": "INC-STPI",
"Hierlevel": 2,
"Valcount": 0,
"Descript": "INC2"
},
"INC-FORT": {
"Groupname": "INC-FORT",
"Hierlevel": 2,
"Valcount": 0,
"Descript": "INC3"
}
},
"INC-BBL": {
"Groupname": "INC-BBL",
"Hierlevel": 1,
"Valcount": 0,
"Descript": "INC4"
},
"INC-PUNE": {
"Groupname": "INC-PUNE",
"Hierlevel": 1,
"Valcount": 0,
"Descript": "INC5"
}
}
}
Я много пытался найти в Интернете информацию о создании N-арных деревьев, но не получил удовлетворительных результатов. Потому что в решении говорится, что если вы знаете n, вы сможете составить дерево, но я не знаю n здесь, поскольку оно может быть случайным.
Я также пробовал использовать стек для вставки узлов к нему, если приближается более высокий уровень иерархии объекта, и pop, если приближается более низкий уровень иерархии объекта.

Код: Выделить всё

@Override
public ResponseDTO getTreeStructure(JSONObject sapResponse) {

JSONObject response = new JSONObject();

Stack treeStack = new Stack();

JSONArray iteratingArray = sapResponse.getJSONArray("TONODES");

for(int i = 0 ; i < iteratingArray.length(); i++){
JSONObject tempObject= iteratingArray.getJSONObject(i);

if(treeStack.empty()) {
treeStack.push(tempObject);
response.put(tempObject.getString("Groupname"), tempObject);
}else if(treeStack.peek().getInt("Hierlevel") < tempObject.getInt("Hierlevel")){
response.getJSONObject(treeStack.peek().getString("Groupname")).put(tempObject.getString("Groupname"), tempObject);
treeStack.push(tempObject);
}else if(treeStack.peek().getInt("Hierlevel") >= tempObject.getInt("Hierlevel")){
while(!treeStack.empty() && treeStack.peek().getInt("Hierlevel") >= tempObject.getInt("Hierlevel")){
treeStack.pop();
}
response.getJSONObject(treeStack.peek().getString("Groupname")).put(tempObject.getString("Groupname"), tempObject);
treeStack.push(tempObject);
}
}

return new ResponseDTO(200, "ok", response);

//return null;
}
Проблема в том, что я не могу заставить предыдущий объект отправить ответ, как и я не могу отследить родительские узлы, чтобы получить и достичь текущего узла для отправки.0(N0) -> 1(N1) -> 2(N2)

Код: Выделить всё

response.getJSONObject(N0).getJSONObjectI(N1).put(N2.getString("Groupname"), N2);
Но вместо этого в моем подходе я получаю

Код: Выделить всё

response.getJSONObject(N1).put(N2)
Я могу получить узел 1 из вершины стека, но не могу отследить родительский 0-й узел, чтобы поместить 2-й объект под 1-й.
Я могу получить узел 1 из вершины стека, но не могу отследить родительский 0-й узел, чтобы поместить 2-й объект под 1-й.
Я могу получить узел 1 из вершины стека, но не могу отследить родительский 0-й узел, чтобы поместить 2-й объект под 1-й.
Я могу получить узел 1 из вершины стека, но я не могу отследить родительский 0-й узел, чтобы поместить 2-й объект под 1-й.
Я могу получить узел 1 из вершины стека, но не могу отследить родительский 0-й узел, чтобы поместить 2-й объект под 1-й. Strong>
Если каким-то образом можно получить предыдущие узлы в соответствии с иерархией, я смогу составить дерево.
Пожалуйста, исправьте мои код или сообщите мне лучший подход к решению этой проблемы.

Подробнее здесь: https://stackoverflow.com/questions/783 ... archy-leve
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «JAVA»