如何解析字符串到Java树?
问题描述:
我有一个方法可以生成带有许多子菜单的弹出式菜单。基本上这些菜单动态给出,所以我必须有算法来处理使用下面的字符串创建子菜单。 为了做到这一点,我将需要通过使用分隔符进行分割来将此字符串转换为Java树。我坚持如何处理拆分的字符串数据,并根据父节点和子节点转换为Java树模型。如何解析字符串到Java树?
的动态字符串值的实施例,我需要解析:
字符串str = “菜单1;菜单2; [Menu2A; Menu2B; [Menu2B-A; Menu2B-B];];菜单3;”;
处理操作后的输出应该是:
Pop-up Menu
/ | \
Menu1 Menu2 Menu3
/ |
Menu2A Menu2B
| \
| \
Menu2B-A Menu2B-B
答
你可以这样做:
- 遍历字符串由左到右,收集字符到当前字符串变量。
- 如果遇到
;
把当前字符串中的数据结构保持(level, array of menu entries for level)
。 - 如果遇到
[
与其他字符串和level + 1递归调用。 - 如果遇到
]
返回。
一些近似的Java代码:
private int parseString(String input, String parent,
Map<String, ArrayList<String>> levels) {
StringBuilder currentString = new StringBuilder();
int index = 0;
while(index < input.length()) {
char c = input.charAt(index);
if(c == ' ') { // ignore spaces
index++;
continue;
}
if(c == ';') { // end of menu entry, add to the list
if(!currentString.toString().isEmpty()) {
levels.put(currentString.toString(), new ArrayList<String>());
levels.get(level).add(currentString.toString());
}
currentString.delete(0, currentString.length());
index++;
continue;
}
if(c == ']') { // end of sublist, return
return index + 1;
}
if(c == '[') { // start of sublist, recursive call
int temp = parseString(input.substring(index + 1),
levels.get(parent).get(levels.get(parent).size() - 1), levels);
index += temp;
index++;
continue;
}
currentString.append(c);
index++;
}
return 0;
}
东西递归 – Tom 2012-02-20 21:23:12