1

練習のために試験をやり直しましたが、ほぼ完了しました。私が持っている唯一の問題は、この部分にあります:

               int z=0,x=0;

               String line="";

               RandomAccessFile read = new RandomAccessFile(s, "rw");


               while((read.readLine())!=null)
                   z++;

               read.seek(0);

               while(x<z){

                   line=read.readLine();

            StringTokenizer stk = new StringTokenizer(line, " ");


            if(line.charAt(0)=='r'){
                nr=z;
                nc=stk.countTokens()-1;
                valori = new int[nr][nc];
                while(stk.hasMoreTokens()){
                stk.nextToken();
                for(int i=0; i<nr; i++)
                    for(int j=0; j<nc; j++)
                    valori[i][j] = Integer.parseInt(stk.nextToken());}
                }
            else if(line.charAt(0)=='c'){
                nr=stk.countTokens()-1;
                nc=z;
                valori = new int[nr][nc];
                while(stk.hasMoreTokens()){
                stk.nextToken();
                for(int i=0; i<nr; i++)
                    for(int j=0; j<nc-1; j++)
                    valori[j][i] = Integer.parseInt(stk.nextToken());}
                }x++;

基本的に、次のように行列の説明があるファイルを読み取る必要があります。

c 0 1 0
c 0 0 1 
c 0 0 0
c 1 0 0

結果の行列は次のようになります。

|0|0|0|1|
|1|0|0|0|
|0|1|0|0|

ファイルを読んだ後、2d int 配列でマトリックスを構築する必要があります。別の演習で同じコードを使用しましたが、stk.nextToken() を使用すると、java.util.StringTokenizer.nextToken(Unknown Source) で java.util.NoSuchElementException が発生します。 )

エラーが見つかりません。2 次元配列は正しく初期化され、埋められています。

助けてくれてありがとう。

4

3 に答える 3

1

例外の「不明なソース」部分は、JDK ではなく jre を介してコードを実行した結果です。JDK で実行する場合、ランタイム環境はデバッグ情報にアクセスでき、代わりに適切な行番号が出力されます。

nr=stk.countTokens()-1; をざっと見てみると、このセクションに誤りがあることがわかります。NC=z; //z == 行数

  //first pass through = hasMoreTokens == true (a total of 4: C,0,1,0)
  while(stk.hasMoreTokens()){
            //first token - C
            stk.nextToken();
            //this will iterate 3 times
            for(int i = 0; i < nr; i++)
                //this, too, will iterate 4 times - a total of 12 times considering
                // the outer loop
                for(int j = 0; j < nc-1; j++)
                   // after 3 passes, this will throw the exception
                   valori[j][i] = Integer.parseInt(stk.nextToken());}
            }x++;
于 2013-01-21T13:56:31.623 に答える
0

このエラーは、1行をトークン化し、2つのforループで列と行を読み取っているために発生します。whileループでStringTokenizerを使用する代わりに、.splitコマンドを使用することをお勧めします。

int j=0;
// read all rows
while((read.readLine())!=null) {

    String line=read.readLine();
    String[] columns=line.split(" ");

    // read columns of each row
    int i=0;
    for (String column: columns) {
        if (!column.equals("c")) {
            valori[j][i] = Integer.parseInt(column);
        }
        i++;
    }

j++;
}

PS:上記の擬似コード、テストされていません。

于 2013-01-21T14:24:58.397 に答える
0

このエラーは、StringTokenizer にトークンが残っていないことを意味し、もう 1 つのトークンを要求しています。「不明なソース」は問題とは関係ありません。これは、Java システム ライブラリのソース コードにアクセスできないことを意味しますが、役に立つとは思えません。

これは、ファイルから読み取った行に含まれるスペース区切りのトークンが予想よりも少ないために発生します。

于 2013-01-21T13:57:30.463 に答える