如何将字符串解析为Java树?

时间:2012-02-20 21:20:02

标签: java

我有一个生成带有许多子菜单的弹出菜单的方法。基本上这些菜单是动态给出的,所以我必须有算法来处理使用下面的字符串创建子菜单。 为了做到这一点,我需要通过使用分隔符拆分将此字符串转换为Java Tree。我坚持如何处理拆分的字符串数据并根据父节点和子节点转换为Java树模型。

我需要解析的动态字符串值的示例:

String str =“Menu1; Menu2; [Menu2A; Menu2B; [Menu2B-A; Menu2B-B];]; Menu3;”;

处理操作后输出应为:

                                 Pop-up Menu
                                 /    |     \
                           Menu1    Menu2   Menu3
                                 /     | 

                              Menu2A     Menu2B
                                          |       \
                                          |        \
                                       Menu2B-A  Menu2B-B

1 个答案:

答案 0 :(得分:2)

您可以执行以下操作:

  • 从左到右遍历字符串,将字符收集到当前字符串变量中。
  • 如果您遇到;,请将当前字符串放入包含(level, array of menu entries for 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;
}