0

さて、以前の問題だったスペースを解析できるようになりました。これで私のパーサーはほぼ準備が整いましたが、私には理解できない欠陥があります。

セグメントの後のデータ (コードを参照) とパイプ間のデータを取得できます。私が到達できないのは、レベルアップして、パイプの間に含まれ、^ で区切られたデータを取得することです。

例えば。

Input String is A|1|2|3^4|
Expected Output
element1        A
element2        1
element3        2
element4.1      3
element4.2      4

しかし、私の現在の出力は

element1        A
element2        1
element3        2
element4       3^4

@ の後にさまざまな ID を持つ例外 1 [Ljava.lang.String;@1786e64 を受け取っています。

以下に示すコメント付きのコードは、問題を引き起こしています。

コード:

Scanner scanner = new Scanner(System.in);
str=scanner.nextLine();
System.out.println(str);
segments="(A)|(B)|(C)|(D)";
pipe="[\\s+\\|+\\+]";
carat="[\\^+]";
for(i=0;i<token_type1.length;i++)
{
token_type2=token_type1[i].toString().split(pipe);
for(j=0;j<token_type2.length;j++)
{           
/*
token_type3=token_type2.toString().split(carat);    
for(k=0;k<token_type3.length;k++)
System.out.println("\t"+(k+1)+" "+token_type3[k]);
*/
System.out.println((j+1)+"\t"+token_type2[j]);
}
System.out.println();
}

お知らせ下さい。

4

3 に答える 3

1

メソッドを使用しますSting.split()。すべての区切り文字について考え、それらをすべて分割する引数として配置します。split は正規表現で機能するため、 のような特殊文字|はエスケープする必要があることに注意してください。たとえば、次の行です。

String[] tokens = str.split("[\\s+\\|]");

入力から予想されるトークンを作成する必要があります。

于 2012-12-13T08:48:56.410 に答える
1

これにより、入力が目的の出力に変換されます (クラスを 2 つの異なるファイルに保存します)。

パーサー.java

public class Parser {

    public static final String ELEMENT_DELIM_REGEX = "\\|";

    public static void main(String[] args) {
        String input = "A|1|2|3^4|";
        String[] tokens = input.split(ELEMENT_DELIM_REGEX);
        Element[] elements = new Element[tokens.length];
        for (int i = 0; i < tokens.length; i++) {
            elements[i] = new Element(i + 1, tokens[i]);
        }
        for (Element element : elements) {
            System.out.println(element);
        }
    }

}

Element.java

public class Element {

    public static final String SUB_ELEMENT_DELIM_REGEX = "\\^";

    private int number;

    private String[] content;

    public Element(int number, String content) {
        this.number = number;
        this.content = content.split(SUB_ELEMENT_DELIM_REGEX);
    }

    @Override
    public String toString() {
        if (content.length == 1) {
            return "Element " + number + "\t" + content[0];
        }
        StringBuilder str = new StringBuilder();
        for (int i = 0; i < content.length; i++) {
            str.append("Element " + number + "." + (i+1) + "\t" + content[i] + "\n");   
        }
        // Delete the last \n
        str.replace(str.length() - 1, str.length(), "");
        return str.toString();
    }
}
于 2012-12-13T14:41:26.410 に答える
0

Scanner() は、デフォルトでスペースを区切り文字として持っています。したがって、scanner.next() を再度実行すると、残りの入力部分 '4' が得られます。

usedelimeter(String pattern)Scanner クラスの api を使用して、独自の区切りを設定できます。

于 2012-12-13T09:13:47.777 に答える