在Java中从嵌套列表解析树

在Java中从嵌套列表解析树,java,parsing,tree,nested-lists,Java,Parsing,Tree,Nested Lists,我必须从Java中的嵌套整数列表创建一个树,如下所示: ((3,8,(7,(3,0,7),(8,8,2)), (4,(7,9,8),8), (((3,6,4),2,6),((9,2,9),4,7,(6,4,5) ),4,(6,4,5)) ) 将解析到此树: 我似乎无法想象嵌套列表如何变成树 注意,空格表示树值为空。节点可能是带有数字的叶子,也可能是节点列表: public abstract class Node { } public class NumberNode extends Node

我必须从Java中的嵌套整数列表创建一个树,如下所示:

((3,8,(7,(3,0,7),(8,8,2)), (4,(7,9,8),8), (((3,6,4),2,6),((9,2,9),4,7,(6,4,5) ),4,(6,4,5)) )

将解析到此树:

我似乎无法想象嵌套列表如何变成树


注意,空格表示树值为空。节点可能是带有数字的叶子,也可能是节点列表:

public abstract class Node {
}

public class NumberNode extends Node {
    private final int number;

    public NumberNode(int number) {
        this.number = number;
    }

    @Override
    public String toString() {
        return Integer.toString(number);
    }
}

public class ListNode extends Node {
    private final List<Node> list = new ArrayList<>();

    public ListNode(Collection<Node> nodes) {
        list.addAll(nodes);
    }

    @Override
    public String toString() {
        StringBuilder buf = new StringBuilder();
        buf.append('(');
        boolean first = true;
        for (Node node: list) {
            if (first) {
                first = false;
            } else {
                buf.append(',');
            }
            buf.append(node);
        }
        buf.append(')');
        return buf.toString();
    }
}
输出:

((3,8,(7,(3,0,7),(8,8,2))), (4,(7,9,8),8), (((3,6,4),2,6),((9,2,9),4,7,(6,4,5) ),4,(6,4,5)) )
((3,8,(7,(3,0,7),(8,8,2))),(4,(7,9,8),8),(((3,6,4),2,6),((9,2,9),4,7,(6,4,5)),4,(6,4,5)))

我似乎无法想象嵌套列表如何变成树…-这好像是家庭作业。你试着问你的老师了吗?我认为你还没有准备好在这里提问,因为你还没有开始编码。您需要编写某种解析器来使用输入字符串。然后,您必须生成一棵树。
public static Node parse(Reader in) throws IOException {
    Scanner scanner = new Scanner(in);
    scanner.nextToken();
    return parse(scanner);
}

private static Node parse(Scanner scanner) throws IOException {
    switch (scanner.getToken()) {
        case NUMBER:
            int value = scanner.getNumber();
            scanner.nextToken();
            return new NumberNode(value);
        case LPAR:
            scanner.nextToken();
            List<Node> nodes = parseList(scanner);
            if (scanner.getToken() != Token.RPAR) {
                throw new RuntimeException(") expected");
            }
            scanner.nextToken();
            return new ListNode(nodes);
        default:
            throw new RuntimeException("Number or ( expected");
    }
}

private static List<Node> parseList(Scanner scanner) throws IOException {
    List<Node> nodes = new ArrayList<>();
    if (scanner.getToken() != Token.RPAR) {
        nodes.add(parse(scanner));
        while (scanner.getToken() == Token.COMMA) {
            scanner.nextToken();
            nodes.add(parse(scanner));
        }
    }
    return nodes;
}
        String s = "((3,8,(7,(3,0,7),(8,8,2))), (4,(7,9,8),8), (((3,6,4),2,6),((9,2,9),4,7,(6,4,5) ),4,(6,4,5)) )";
        System.out.println(s);
        Node node = parse(new StringReader(s));
        System.out.println(node);
((3,8,(7,(3,0,7),(8,8,2))), (4,(7,9,8),8), (((3,6,4),2,6),((9,2,9),4,7,(6,4,5) ),4,(6,4,5)) )
((3,8,(7,(3,0,7),(8,8,2))),(4,(7,9,8),8),(((3,6,4),2,6),((9,2,9),4,7,(6,4,5)),4,(6,4,5)))