2012-02-20 72 views
1

我有一个方法可以生成带有许多子菜单的弹出式菜单。基本上这些菜单动态给出,所以我必须有算法来处理使用下面的字符串创建子菜单。 为了做到这一点,我将需要通过使用分隔符进行分割来将此字符串转换为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 
+2

东西递归 – Tom 2012-02-20 21:23:12

回答

2

你可以这样做:

  • 遍历字符串由左到右,收集字符到当前字符串变量。
  • 如果遇到;把当前字符串中的数据结构保持(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; 
} 
+1

嗨铎!我试图确定什么是父变量,它会保存什么样的数据? @Tudor – mbasol 2012-02-22 21:14:15

+0

'parent'只是一个包含父项名称的字符串。 – Tudor 2012-02-22 21:14:44

+0

以及'input'将持有的菜单项名称,'parent'将举行一个字符串,但我需要为了得到'input'变量父separetely处理'parent'?对不起,我有点困惑。 @Tudor – mbasol 2012-02-22 21:24:17