Разбиение строки на меньшие части на основе паренов - PullRequest
1 голос
/ 01 мая 2009

Используя Java, я пытаюсь разработать метод с использованием рекурсии для анализа строки вида:

(PART0(PART1(PART2)(PART3)))

Я хочу, чтобы метод разделил соответствующие строки. Я хочу, чтобы этот метод дал мне возможность выполнять некоторую логику для каждой части строки без скобок, включенных в этот порядок:

PART2
PART3
PART1
PART0

Вот как выглядит мой метод:

private void check(String stmt) throws Exception {

    System.out.println(stmt);
    int firstIndex = 0;
    int lastIndex = 0;
    while(firstIndex !=-1){
        firstIndex = stmt.indexOf('(');
        lastIndex = stmt.lastIndexOf(')');

        check(stmt.substring(firstIndex+1,lastIndex));

     }
}

Вот мой вывод:

(PART0(PART1(PART2)(PART3)))
PART0(PART1(PART2)(PART3))
PART1(PART2)(PART3)
PART2)(PART3

В основном это разбивается на эту часть: ЧАСТЬ1 (ЧАСТЬ2) (ЧАСТЬ3)

Есть ли более элегантный способ сделать это?

1 Ответ

11 голосов
/ 01 мая 2009

Вложенные контексты наиболее естественно работают как стек.

-Каждый раз, когда вы начинаете новый контекст (встреча '(') push ()

-Каждый раз, когда вы выходите из контекста (встреча ')') pop ()

-Каждый pop () будет соответствовать полному контексту

т.е.:

public static void main(String args[])
    {
         String s   = "(PART0(PART1(PART2)(PART3)))";
        Stack<StringBuilder> stack = new Stack<StringBuilder>();
        StringBuilder curr = null;
        for (int i = 0; i < s.length(); i++)
        {
            char c = s.charAt(i);
            if (c == '(')
            {
                curr = new StringBuilder();
                stack.push(curr);
            }
            else if (c == ')')
            {
                System.out.println(stack.pop());
            }
            else
            {
                curr.append(c);
            }
        }
    }

Возможно, вы также захотите добавить некоторую проверку ошибок, т. Е. Если нет контекста, в который нужно нажимать или выдвигать, то у вас есть несовпадающие символы (неправильная строка).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...