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 )

我找不到错误,二维数组已正确初始化和填充。

提前感谢您的帮助。

4

3 回答 3

1

异常的“未知来源”部分是通过 jre 而不是 JDK 运行代码的效果。如果您使用 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

此错误意味着 StringTokenizer 中没有剩余的令牌,您要求再提供一个令牌。“未知来源”与您的问题无关 - 这只是意味着您无法访问 Java 系统库的源代码,但我怀疑它是否会有所帮助。

发生这种情况是因为您从文件中读取的行包含的空格分隔标记比您预期的要少。

于 2013-01-21T13:57:30.463 回答
0

发生错误是因为您正在标记一行,并且在两个 for 循环中您正在读取列和行。我建议不要将 StringTokenizer 与 while 循环一起使用,而是使用 .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 回答