ループのために壊すの代わりに繰り返し

スティービー:

私は、Javaのテンプレートライブラリを作成するためのコードを書いています。私は読者がテンプレートのテキストを読んで、プレースホルダ( "$ {プレースホルダを})引き抜きますコードの特定の部分を書いています。これまでのところ、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);
タイタス:

あなたの現在のソリューションの復帰最初のプレースホルダが発見された後、あなたは内のすべての文字を通過するように変更することができます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();
}

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=219483&siteId=1