2012-02-20 2 views
1

У меня есть метод, который создает всплывающее меню со многими подменю. В основном эти меню заданы динамически, поэтому у меня должен быть алгоритм обработки подменю с использованием ниже строки. Для этого мне нужно будет преобразовать эту строку в дерево Java, разделив ее с помощью разделителя. Я зациклился на том, как обрабатывать разделенные строковые данные и переводить на Java Tree Model в соответствии с родительскими и дочерними узлами.Как разбирать строку в дерево Java?

Пример динамического строковых значений, которые мне нужно разобрать:

Строка Str = "menu1; menu2; [Menu2A; Menu2B; [Menu2B-А; Menu2B-В];]; menu3;";

После обработки операции Выход должен быть:

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

           Menu2A  Menu2B 
              |  \ 
              |  \ 
             Menu2B-A Menu2B-B 
+2

Что-то рекурсивный – Tom

ответ

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; 
} 
+1

Привет Tudor! Я пытаюсь определить, что именно представляет собой родительская переменная и какие данные она будет хранить? @Tudor – mbasol

+0

'parent' - это просто строка, содержащая имя родителя. – Tudor

+0

well 'input' будет содержать названия пунктов меню,' parent' будет содержать строку, но мне нужно обрабатывать 'parent' separetely, чтобы получить родительский элемент из переменной' input'? извините, я немного смущен. @Tudor – mbasol

Смежные вопросы