将某个字符后的所有行缩进到另一个字符

时间:2017-03-21 04:38:13

标签: java parsing indentation

对于作业,我们正在创建一个接受java文件的java程序,修复凌乱的代码并输出到新文件。

我们假设每行只有一个括号{ },并且每个括号都出现在该行的末尾。 if / else语句也使用括号。

我目前无法找到一种方法在开始括号后缩进每一行直到下一个右括号,然后在关闭括号后减少缩进直到下一个开始括号。我们还需要使用以下方法:

稍微更新了一下代码:

public static void processJavaFile() {
        }
}

1 个答案:

答案 0 :(得分:1)

此算法应该让您入门。我留下了一些你必须解决的问题。 (例如,它不会缩写您当前编写的{方括号},并为每个分号添加额外的换行符)

缩进由深度'处理。计数器跟踪有多少标签'加上。

如果您想要对每次迭代进行更多控制,请考虑使用条件for循环而不是foreach。 (我写这个快速的东西只是为了让你知道如何做到这一点)

public String parse(String input) {
    StringBuilder output = new StringBuilder();
    int depth = 0;
    boolean isNewLine = false;
    boolean wasSpaced = false;
    boolean isQuotes = false;
    String tab = "     ";
    for (char c : input.toCharArray()) {
        switch (c) {
        case '{':
            output.append(c + "\n");
            depth++;
            isNewLine = true;
            break;
        case '}':
            output.append("\n" + c);
            depth--;
            isNewLine = true;
            break;
        case '\n':
            isNewLine = true;
            break;
        case ';':
            output.append(c);
            isNewLine = true;
            break;
        case '\'':
        case '"':
            if (!isQuotes) {
                isQuotes = true;
            } else {
                isQuotes = false;
            }
            output.append(c);
            break;
        default:
            if (c == ' ') {
                if (!isQuotes) {
                    if (!wasSpaced) {
                        wasSpaced = true;
                        output.append(c);
                    }
                } else {
                    output.append(c);
                }
            } else {
                wasSpaced = false;
                output.append(c);
            }
            break;
        }
        if (isNewLine) {
            output.append('\n');
            for (int i = 0; i < depth; i++) {
                output.append(tab);
            }
            isNewLine = false;
        }
    }
    return output.toString();
}