在Java中从嵌套列表解析树
我必须从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)) ) 将解析到此树: 我似乎无法想象嵌套列表如何变成树在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
注意,空格表示树值为空。节点可能是带有数字的叶子,也可能是节点列表:
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)))