对于循环爆发而不是重复进行

时间:2019-05-09 17:46:32

标签: java

我正在编写代码来创建Java模板库。我正在编写一段特定的代码,读者可以阅读模板文本并拉出占位符(“ $ {placeholder})。到目前为止,当进行Jtesting时,它似乎可以使用单个占位符,但是当我尝试时不止一个,这些代码似乎并没有环回并读取模板的其余部分。

我一生都无法看到代码失败的原因。

我已经调试了代码,我所看到的是,当它存储了第一个占位符时,它并没有环回,而是退出了。

代码如下:

import java.io.IOException;
import java.io.Reader;

public class placeholderFinder {
    private Reader reader;

    public placeholderFinder(Reader reader) {
        this.reader = reader;
    }

    public static final int NORMALTEXT = 0;
    public static final int PLACEHOLDERTEXT = 1;

    private int state = NORMALTEXT;
    private StringBuilder placeholder = new StringBuilder();

    public String nextPlaceholderFinder() throws IOException {
        for (int p = reader.read(); p != -1; p = reader.read()) {
            if (p == '$') {
                if (state == NORMALTEXT) {
                    state = PLACEHOLDERTEXT; 
                    placeholder.append((char) p);
                } 
            } else if (state == PLACEHOLDERTEXT) {
                        placeholder.append((char) p);
                    }

            if (p == '}') {
                    if (state == PLACEHOLDERTEXT) {
                        state = NORMALTEXT;
                        String placeholderStore = placeholder.toString();
                        placeholder.setLength(0);
                        return placeholderStore;

                    }

                }

            }

        return null;

    }

}

还有Jtest

@Test
void testWithPlaceholders() throws IOException {
    Reader reader = new StringReader("a ${name} ${date}");
    placeholderFinder finder = new placeholderFinder(reader);
    String expectedresult = "${name}${date}";
    String actualcode = finder.nextPlaceholderFinder();
    assertEquals(expectedresult, actualcode);

2 个答案:

答案 0 :(得分:0)

之所以只找到一个占位符(例如${name}),是因为一旦找到}符号,您就必须做一个return语句。 在这一行:

return placeholderStore;

尝试将第一个占位符的临时结果放入列表,如下所示:

List<String> results = new ArrayList<String>();

而不是返回占位符存储,而是将其放置在列表中:

results.add(placeholderStore);

当您阅读了整个文本(无论实际包含什么内容)后,您将返回此结果列表(并更改方法的返回类型)。或者您再次加入列表:

String.join("", results);

答案 1 :(得分:0)

找到第一个占位符后,您当前的解决方案将返回,您可以对其进行更改以遍历reader中的所有字符,然后再返回。这是一个示例:

public String nextPlaceholderFinder() throws IOException {
    for (int p = reader.read(); p != -1; p = reader.read()) {
        if (p == '$') {
            if (state == NORMALTEXT) {
                state = PLACEHOLDERTEXT; 
                placeholder.append((char) p);
            } 
        } else if (state == PLACEHOLDERTEXT) {
            placeholder.append((char) p);
        }
        if (p == '}') {
            if (state == PLACEHOLDERTEXT) {
                state = NORMALTEXT;
            }
        }
    }
    return placeholder.toString();
}