Как заказать номера столбцов JSON определенным образом в Java - PullRequest
0 голосов
/ 23 марта 2019

Я разработал приложение в Spring Boot.Пользователь может загрузить файл CSV, который содержит столбцы с цифрами и кодами.В коде Java я могу получить столбец чисел.

CSV.File

number   code
12
121
122
123
1211
1212
1231
124

Моя цель и ответ даст:

ответ - цель

json: [{ number: 12, 
    child: [{number: 121, 
       child: [{number: 1211 }, { number: 1212 }]
    }] 
}, {number: 122 },
   {number: 123, child:[{number: 1231}] }.....etc
]

Как упорядочить эту структуру JSON в Java по родительскому и дочернему элементам?Например, 12 является родительским для 121, а 121 является родительским для 1211 и 1212.

Обновление:

Входные значения:

12
121
122
123
1211
1212
1231
14
141
142
1411
25
251
2511
2512
252
253

Вывод ответа

    response: [
   {
      "number": 12,
      "child": [
         {
            "number": 121,
            "child": [
               {
                  "number": 1211
               },
               {
                  "number": 1212
               }
            ]
         },
         [
            {
               "number": 122
            }
         ],
         [
            {
               "number": 123,
               "child": [
                  {
                     "number": 1231
                  }
               ]
            }
         ]
      ]
   },
   {
      "number": 14,
      "child": [
         {
            "number": 141,
            "child": [
               {
                  "number": 1411
               }
            ]
         },
         [
            {
               "number": 142
            }
         ]
      ]
   },
   {
      "number": 25,
      "child": [
         {
            "number": 251,
            "child": [
               {
                  "number": 2511
               },
               {
                  "number": 2512
               }
            ]
         },
         [
            {
               "number": 252
            }
         ],
         [
            {
               "number": 253
            }
         ]
      ]
   }
]

Ответы [ 2 ]

1 голос
/ 24 марта 2019

Это на самом деле не вопрос Java или JSON. Вкратце ваш вопрос - как собрать список значений в древовидную структуру, зная отношения предка-потомка между элементами списка.

Алгоритм, который я придумал, таков:

  1. Выберите элемент и проверьте, является ли он потомком одного из корней. Если это не так - добавьте его в список корней. Проверьте, существует ли какой-либо корни на самом деле являются потомками этого элемента и назначают их как например, если они есть (например, если у нас есть 12 на входе, а затем 1 мы следует переместить 12, чтобы быть ребенком от 1 - хотя это может быть не совсем необходимо в этом конкретном случае, если наш вход отсортирован, например, 1 воля всегда приходить до 12 до 123 и т. д.). Обратите внимание, что эта часть является необязательной из-за сортировки ввода, но несколько неполной, если вы работаете с несортированным вводом (не даст должного результата, если у 12 будет 12, а затем 1234 - и 1234, и 123 будут потомками 12, но это не правильно - 1234 должен стать ребенком 123, а не 12 напрямую). Это будет домашнее задание для вас, чтобы завершить его; -)
  2. Если это потомок какого-то корень - найдите потомка корня, от которого он также может быть потомком. Если такого нет - назначьте его прямым ребенком. Если есть, относитесь к этому как к потенциальному родителю, а затем проверяйте, что это дети для потенциального родителя и т. д. рекурсивно.

Вот полное рабочее решение, которое производит JSON, как вы ожидали:

package tmpjavaproj;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.TreeSet;

import com.fasterxml.jackson.annotation.JsonInclude.Include;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;

public class Test {

    public static class Node implements Comparable<Node> {
        public int number;
        public List<Node> child; // Although this should actually be called children, not child

        public int hashCode() {
            return number;
        }

        public boolean equals(Node node) {
            return number == node.number;
        }

        public int compareTo(Node node) {
            return number - node.number;
        }
    }

    public static void main(String[] args) throws Exception {
        String[] inputs = { "12", "121", "122", "123", "1211", "1212", "1231", "14", "141", "142", "1411", "25", "251", "2511", "2512", "252", "253" };

        Set<Node> roots = new TreeSet<>();

        for (String input : inputs) {
            Node node = new Node();
            node.number = Integer.parseInt(input);

            Node root = null;
            for (Node rootCandidate : roots) {
                if (input.startsWith(String.valueOf(rootCandidate.number))) {
                    root = rootCandidate;
                    break;
                }
            }
            if (root == null) {
                List<Node> rootsToChildren = new ArrayList<>();
                for (Node aRoot : roots) {
                    if (String.valueOf(aRoot.number).startsWith(String.valueOf(node.number))) {
                        rootsToChildren.add(aRoot);
                    }
                }
                if (!rootsToChildren.isEmpty()) {
                    node.child = rootsToChildren;
                    roots.removeAll(rootsToChildren);
                }
                roots.add(node);
            } else {
                Node parentCandidate = root;
                while (root != null) {
                    root = null;
                    if (parentCandidate.child != null) {
                        for (Node child : parentCandidate.child) {
                            if (input.startsWith(String.valueOf(child.number))) {
                                parentCandidate = child;
                                root = child;
                            }
                        }
                    }
                }
                if (parentCandidate.child == null) {
                    parentCandidate.child = new ArrayList<>();
                }
                parentCandidate.child.add(node);
            }
        }

        Map<String, Set<Node>> response = new HashMap<>();
        response.put("response", roots);
        ObjectMapper mapper = new ObjectMapper();
        mapper.enable(SerializationFeature.INDENT_OUTPUT);
        mapper.setSerializationInclusion(Include.NON_NULL);
        System.out.println(mapper.writeValueAsString(response));
    }
}
0 голосов
/ 24 марта 2019

Создайте объект ответа, который имеет два поля.

public class Response() {

  public int number;

  public List<Response> children;

}

Этот класс даст вам то, что вы хотите.

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