Группировка списка строк, разделенных точками

Группировать строку, разделенную точкой, в фиксированный формат

На входе я получил массив следующих строк, представляющих некоторую древовидную структуру:

    "323-060",
    "323-060.040",
    "323-060.040.030",    
    "323-060.088",
    "323-060.088.020",    
    "323-060.010",
    "323-060.010.080",
    "323-060.010.080.020",
    "323-060.010.080.060"

Это древовидная структура:

«323-060» — корень И это дерево имеет следующую иерархию

323-060   /*rot*/
        040       /*second level, full path: 323-060.040*/
            030   /* third level, full path: 323-060.040.303 */
        088
            020

В результате мне нужно получить следующий сгруппированный список:

"323-060\323-060.040\323-060.040.030"
"323-060\323-060.088\323-060.088.020"
"323-060\323-060.010\323-060.010.080\323-060.010.080.020"
"323-060\323-060.010\323-060.010.080\323-060.010.080.060"

Как это сделать на Java?

Я думаю, что ваши входные и выходные данные нуждаются в форматировании. А так непонятно, чего вы хотите. В некоторых местах также кажется, что вам не хватает нескольких кавычек.

Asmir 07.08.2024 13:50

Как упомянул @Asmir, ваш вопрос сложен для понимания конечной цели, которую вы хотите достичь. Пожалуйста, отформатируйте ваш код правильно. Рассмотрите возможность добавления как можно большего количества деталей.

Hagelslag 07.08.2024 13:58

Чтение входных данных, анализ входной строки, размещение подобных строк в одной строке, запись выходных строк.

Gilbert Le Blanc 07.08.2024 14:07

Объясните, по каким критериям осуществляется группировка, и покажите это на примерах. Не ждите, что люди просто сделают вывод из примера вывода.

aled 07.08.2024 14:18
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
4
57
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

В приведенном ниже коде класс Node представляет каждый node в дереве. buildTree() метод создает дерево из входных данных, разделяя каждую строку точками для получения частей. А HashMap предназначен для отслеживания nodes по их полному пути. Для каждой части мы проверяем, существует ли node на карте, если нет, создаем новую. Внутри метода generatePaths() мы рекурсивно обходим дерево, чтобы создать ожидаемый результат.

package org.example;

import java.util.*;

public class GroupString {
    static class Node {
        String value;
        List<Node> children;

        Node(String value) {
            this.value = value;
            this.children = new ArrayList<>();
        }
    }

    public static void main(String[] args) {
        String[] input = {
                "323-060",
                "323-060.040",
                "323-060.040.030",
                "323-060.088",
                "323-060.088.020",
                "323-060.010",
                "323-060.010.080",
                "323-060.010.080.020",
                "323-060.010.080.060"
        };

        Node root = buildTree(input);
        List<String> result = new ArrayList<>();
        generatePaths(root, new ArrayList<>(), result);

        for (String path : result) {
            System.out.println(path);
        }
    }

    private static Node buildTree(String[] input) {
        Map<String, Node> nodeMap = new HashMap<>();
        Node root = null;

        for (String path : input) {
            String[] parts = path.split("\\.");
            StringBuilder currentPath = new StringBuilder();
            Node parent = null;

            for (String part : parts) {
                if (currentPath.length() > 0) {
                    currentPath.append(".");
                }
                currentPath.append(part);
                String key = currentPath.toString();

                Node currentNode = nodeMap.getOrDefault(key, new Node(key));
                nodeMap.putIfAbsent(key, currentNode);

                if (parent != null) {
                    if (!parent.children.contains(currentNode)) {
                        parent.children.add(currentNode);
                    }
                } else {
                    root = currentNode;
                }

                parent = currentNode;
            }
        }

        return root;
    }

    private static void generatePaths(Node node, List<String> path, List<String> result) {
        if (node == null) return;

        path.add(node.value);

        if (node.children.isEmpty()) {
            result.add(String.join("\\", path));
        } else {
            for (Node child : node.children) {
                generatePaths(child, new ArrayList<>(path), result);
            }
        }
    }
}

Идеальный!!! Спасибо, оу

Evgeniy Skiba 07.08.2024 16:48

Приятно видеть, что ответ точный, я был бы признателен, если бы вы приняли его хорошо.

Hagelslag 07.08.2024 19:07

Сначала я сгруппировал пути по их общему корню и сделал это с помощью Map<String, List<>, где ключом является корень, а значением — список путей, начинающийся с этого корня.

Для генерации и печати этих путей я создал еще одну функцию с именемgeneratePaths:

Метод GeneratePaths вызывается для каждого корня, и этот метод создает древовидную структуру. Он разбивает каждый путь по точкам и строит иерархию, создавая вложенную структуру.

import java.util.*;

public class TreeStructure {
    public static void main(String[] args) {
        List<String> input = Arrays.asList(
            "323-060",
            "323-060.040",
            "323-060.040.030",    
            "323-060.088",
            "323-060.088.020",    
            "323-060.010",
            "323-060.010.080",
            "323-060.010.080.020",
            "323-060.010.080.060"
        );

        // Group paths by their common roots
        Map<String, List<String>> groupedPaths = new TreeMap<>();
        for (String path : input) {
            String[] parts = path.split("\\.");
            String root = parts[0];
            groupedPaths.putIfAbsent(root, new ArrayList<>());
            groupedPaths.get(root).add(path);
        }

        // Generate and print the formatted output
        for (String root : groupedPaths.keySet()) {
            generatePaths(groupedPaths.get(root), root);
        }
    }

    private static void generatePaths(List<String> paths, String root) {
        Map<String, List<String>> tree = new TreeMap<>();
        for (String path : paths) {
            String[] parts = path.split("\\.");
            String currentPath = parts[0];
            for (int i = 1; i < parts.length; i++) {
                currentPath += "\\" + parts[i];
                tree.putIfAbsent(currentPath, new ArrayList<>());
                if (i + 1 < parts.length) {
                    tree.get(currentPath).add(currentPath + "\\" + parts[i + 1]);
                }
            }
        }

        for (String key : tree.keySet()) {
            System.out.println(root + "\\" + key);
        }
    }
}

Я надеюсь, что этот код разрешит ваши вопросы.

Большой. Спасибо

Evgeniy Skiba 08.08.2024 17:59

Другие вопросы по теме