2012-02-20 145 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