在java中从线性树结构创建嵌套列表的方法是什么?

时间:2016-06-09 12:09:50

标签: java tree

我的目标是创建一个类来表示java中类别的层次结构模式。现在从数据库中我得到了我需要构建的路径,如下所示;

" 123_456_789" " 123_67" " 895_444"

获得上述2个字符串作为输入。我的目标是将上述数据转换为以下结构

categories[
    {
    categoryId:123,
        subcategories[{
            categoryId:456,
                subcategories[{
                    categoryId:789
                    }]
            },
            {
                categoryId:67
            }
        ]
    },
    {
    categoryId:895,
        subcategories[{
            categoryId:444
            }]
    }]

将输入转换为类似带有listIds列表的类的java对象的最简单方法是什么。

1 个答案:

答案 0 :(得分:0)

首先需要将其存储在树型数据结构中,然后像json pretty print一样打印。

你需要在classpath中使用gson jar,你可以在 gson.jar

找到它

以下是您提出的问题的工作代码:

import java.util.*;
import java.util.Map.Entry;
import com.google.gson.*;

public class MainTest {
public static void main(String[] args) {
    String arr[] = new String[] { "123_456_789", "123_67", "895_444" };
    Node node = new Node(null, arr);
    // System.out.println(node);
    Gson gson = new GsonBuilder().setPrettyPrinting().create();
    JsonParser jp = new JsonParser();
    JsonElement je = jp.parse(node.toString());
    String prettyJsonString = gson.toJson(je);
    System.out.println(prettyJsonString.replaceAll("\"", ""));
}

static class Node {
    String value;
    List<Node> list;

    public Node(String value, String arr[]) {
        this.value = value;
        list = new ArrayList<Node>();
        if (arr != null && arr.length > 0) {
            Map<String, List<String>> map = new LinkedHashMap<String, List<String>>();
            for (String str : arr) {
                int _ = str.indexOf("_");
                if (_ > 0) {
                    String key = str.substring(0, _);
                    String currentValue = str.substring(_ + 1);
                    List<String> list = map.get(key);
                    if (list == null) {
                        list = new ArrayList<String>();
                    }
                    list.add(currentValue);
                    map.put(key, list);
                } else {
                    map.put(str, null);
                }
            }
            for (Entry<String, List<String>> entry : map.entrySet()) {
                if (entry.getValue() == null) {
                    list.add(new Node(entry.getKey(), null));
                } else {
                    list.add(new Node(entry.getKey(), entry.getValue()
                            .toArray(new String[entry.getValue().size()])));
                }
            }
        }

    }

    @Override
    public String toString() {
        if (this.value == null) {
            StringBuilder sb = new StringBuilder();
            sb.append("{\"categories\":[" + "\n");
            Iterator<Node> iter = list.iterator();
            while (iter.hasNext()) {
                sb.append(iter.next());
                if (iter.hasNext()) {
                    sb.append(",");
                }
            }
            sb.append("]}");
            return sb.toString();

        } else {
            StringBuilder sb = new StringBuilder();
            Iterator<Node> iter = list.iterator();

            sb.append("{\"categoryId\":" + value + "}"
                    + (iter.hasNext() ? "," : "") + "\n");
            if (iter.hasNext()) {
                sb.append("{\"subcategories\":[" + "\n");
                while (iter.hasNext()) {
                    // sb.append("{");
                    sb.append(iter.next());
                    // sb.append("}");
                    if (iter.hasNext()) {
                        sb.append(",");
                    }
                }
                sb.append("]}" + "\n");
            }
            return sb.toString();
        }
    }
}
}