1

編集: 全体のメソッドは次のとおりです。

        public static String[] singlemultiplet(String filename, int numofzeros) throws IOException {//isolate notes between brackets
    Scanner inputmeasure = new Scanner(new DataInputStream(new FileInputStream(filename)));
        InputStream is = new BufferedInputStream(new FileInputStream(filename));
            BufferedReader bReader = new BufferedReader(new InputStreamReader(is));
            StringBuffer sbfFileContents = new StringBuffer();
            String line = null;
            int lineCount = 0;
    int j = 0;
        int[] cmn = new int[countbrackets(filename)];
        String[] numbers = new String[40];
        String[][] matrix = new String[20][120];
        String[][] matrix2 = new String[20][120];
        String[][] matrix3 = new String[20][120];
            line = inputmeasure.useDelimiter("\n").next();
            Scanner s = new Scanner(line).useDelimiter("U");
            matrix[0][0] = s.useDelimiter("\r").next();
            String ubar = "U|";
            matrix2[0][0] = matrix[0][0].replace("\\),","U").replaceAll("\\)","U").replace(ubar,"U");
            matrix3[0][0] = matrix2[0][0].replace("|","U");
            Scanner s2 = new Scanner(matrix3[0][0]).useDelimiter("U");
            String brack = "(";
            String[] multiplet = new String[countmultipletsandmeasures(filename) + numofzeros];
            String[] multiplet2 = new String[countmultipletsandmeasures(filename) + numofzeros];
            Arrays.fill(multiplet, "");
            int cmampluszeros = countmultipletsandmeasures(filename) + numofzeros;
             for (int i = 0; i < cmampluszeros; i++)
             {
              matrix3[0][0] = s2.useDelimiter("U").next();
              multiplet[i] = matrix3[0][0];

             }
             lineCount++;
                    sbfFileContents.append(line);

            String strContent = sbfFileContents.toString();
    try {
        return multiplet;
    } finally {
        is.close();
    }
}

multipletメソッドが、読み込む行のチャンクを含む配列を返すようにしたいのですMatrix3[0]。メソッドは、以下に示すように行をチャンクする必要があるため、「)」または「|」が検出された場合。

の最初の行を読み込もうとするとMatrix3[0]

(A#,A#,A#),(B#,B#,C#),(B#,B#,C#),(Bb,Bb,Cb)|(Ab,Ab,Ab),(Bb,Bb,Cb),(Bb,Bb,Cb),(Bb,Bb,Cb)|

プログラムはチャンクを与えます

multiplet[i]

なので

multiplet: (A#,A#,A#
multiplet: ,(B#,B#,C#
multiplet: ,(B#,B#,C#
multiplet: ,(Bb,Bb,Cb
multiplet: (Ab,Ab,Ab
multiplet: ,(Bb,Bb,Cb
multiplet: ,(Bb,Bb,Cb
multiplet: ,(Bb,Bb,Cb

どちらが正しい。しかし、読み込もうとすると、。が表示され (A#,A#,A#),(B#,B#,C#),(B#,B#,C#),(Bb,Bb,Cb)|A#,B#,C#,D#, E#,F#,G#, | ,A, , , , , , , , , , , , , , |ますNoSuchElementException。正しい出力は次のようになります。

multiplet: (A#,A#,A#
multiplet: ,(B#,B#,C#
multiplet: ,(B#,B#,C#
multiplet: ,(Bb,Bb,Cb
multiplet: A#,B#,C#,D#, E#,F#,G#,  
multiplet:   ,A,  , ,   ,  ,  ,  ,  ,  ,  , ,   ,  ,  ,  

正しい出力を得る理由と私が何をすべきかを誰かが知っていますか?

編集:

デバッグすると、次のスタックトレースが得られます。

ブレークポイントヒット: "thread = main"、IOguitar.singlemultiplet()、line = 2,769 bci = 306 2,769 matrix3 [0] [0] = s2.useDelimiter( "U")。next();

main[1]ステップ

完了したステップ: "thread = main"、IOguitar.singlemultiplet()、line = 2,770 bci = 322 2,770 multilet [i] = matrix3 [0] [0];

main[1]ステップ

完了したステップ: "thread = main"、IOguitar.singlemultiplet()、line = 2,767 bci = 333 2,767 for(int i = 0; i <cmampluszeros; i ++)

main[1]ステップ

完了したステップ:ブレークポイントヒット: "thread = main"、IOguitar.singlemultiplet()、line = 2,769 bci = 306 2,769 matrix3 [0] [0] = s2.useDelimiter( "U")。next();

main[1]ステップ

完了したステップ: "thread = main"、IOguitar.singlemultiplet()、line = 2,770 bci = 322 2,770 multilet [i] = matrix3 [0] [0];

main[1]ステップ

完了したステップ: "thread = main"、IOguitar.singlemultiplet()、line = 2,767 bci = 333 2,767 for(int i = 0; i <cmampluszeros; i ++)

main[1]ステップ

完了したステップ:ブレークポイントヒット: "thread = main"、IOguitar.singlemultiplet()、line = 2,769 bci = 306 2,769 matrix3 [0] [0] = s2.useDelimiter( "U")。next();

main[1]ステップ

完了したステップ: "thread = main"、IOguitar.singlemultiplet()、line = 2,770 bci = 322 2,770 multilet [i] = matrix3 [0] [0];

main[1]ステップ

完了したステップ: "thread = main"、IOguitar.singlemultiplet()、line = 2,767 bci = 333 2,767 for(int i = 0; i <cmampluszeros; i ++)

main[1]ステップ

完了したステップ:ブレークポイントヒット: "thread = main"、IOguitar.singlemultiplet()、line = 2,769 bci = 306 2,769 matrix3 [0] [0] = s2.useDelimiter( "U")。next();

main[1]ステップ

完了したステップ: "thread = main"、IOguitar.singlemultiplet()、line = 2,770 bci = 322 2,770 multilet [i] = matrix3 [0] [0];

main[1]ステップ

完了したステップ: "thread = main"、IOguitar.singlemultiplet()、line = 2,767 bci = 333 2,767 for(int i = 0; i <cmampluszeros; i ++)

main[1]ステップ

完了したステップ:ブレークポイントヒット: "thread = main"、IOguitar.singlemultiplet()、line = 2,769 bci = 306 2,769 matrix3 [0] [0] = s2.useDelimiter( "U")。next();

main[1]ステップ

完了したステップ: "thread = main"、IOguitar.singlemultiplet()、line = 2,770 bci = 322 2,770 multilet [i] = matrix3 [0] [0];

main[1]ステップ

完了したステップ: "thread = main"、IOguitar.singlemultiplet()、line = 2,767 bci = 333 2,767 for(int i = 0; i <cmampluszeros; i ++)

main[1]ステップ

完了したステップ:ブレークポイントヒット: "thread = main"、IOguitar.singlemultiplet()、line = 2,769 bci = 306 2,769 matrix3 [0] [0] = s2.useDelimiter( "U")。next();

main[1]ステップ

完了したステップ: "thread = main"、IOguitar.singlemultiplet()、line = 2,770 bci = 322 2,770 multilet [i] = matrix3 [0] [0];

main[1]ステップ

完了したステップ: "thread = main"、IOguitar.singlemultiplet()、line = 2,767 bci = 333 2,767 for(int i = 0; i <cmampluszeros; i ++)

main[1]ステップ

完了したステップ:ブレークポイントヒット: "thread = main"、IOguitar.singlemultiplet()、line = 2,769 bci = 306 2,769 matrix3 [0] [0] = s2.useDelimiter( "U")。next();

main[1]ステップ

完了したステップ: "thread = main"、IOguitar.main()、line = 2,662 bci = 35,573 2,662 e.printStackTrace();

main[1]ステップ

java.util.NoSuchElementException at java.util.Scanner.throwFor(Scanner.java:838)at java.util.Scanner.next(Scanner.java:1347)at IOguitar.singlemultiplet(IOguitar.java:2769)at IOguitar.countmultipletn (IOguitar.java:3121)IOguitar.main(IOguitar.java:187)

完了したステップ: "thread = main"、IOguitar.main()、line = 2,668 bci = 35,578 2,668}

main [1]

しかし、私は今何をしなければなりませんか?

4

1 に答える 1

0

正規表現は、この種の構文解析を処理するためのより簡単な方法です(それはそれのために作られています!)。Stringには便利なメソッドがsplit(String regex)あります。これは、文字列を必要に応じて分割し、必要に応じて文字列の配列に配置します。次の行でうまくいきます。

String[] multiplet = "(A#,A#,A#),(B#,B#,C#),(B#,B#,C#),(Bb,Bb,Cb)|(Ab,Ab,Ab),(Bb,Bb,Cb),(Bb,Bb,Cb),(Bb,Bb,Cb)|".split("(\\)|\\|)+");

正規表現の説明:

\\)

\\エスケープする)ので、文字通りの ")"

|

これは、または正規表現言語で意味します。

\\|

リテラル"|"

("|" or ")")+

+角かっこで囲まれたものは少なくとも1回は必要であり、貪欲である(つまり、2つ以上の場合)または| 隣接していると、それらすべてで分割され、それらの間に空の文字列が残されません。

于 2013-03-24T22:46:48.883 に答える