我正在编写一个Java程序来尝试解析文本文件并将其内容存储在矩阵中。以下是我的Java代码:
import java.io.*;
import java.util.*;
public class Viterbi
{
String[][] gmatrix = new String[50][4];
float[] pmatrix = new float[50];
public Viterbi(String filename)
{
BufferedReader br = null;
try
{
String currentline;
StringTokenizer st;
br = new BufferedReader(new FileReader(filename));
while((currentline = br.readLine()) != null)
{
st = new StringTokenizer(currentline, ";");
while(st.hasMoreTokens())
{
for(int i=0; i<50; i++)
{
for(int j=0; j<4; j++)
{
gmatrix[i][j] = st.nextToken();
System.out.println("i --> " + i + " j--> " + j + ": " + gmatrix[i][j]+"\t");
}
}
}
}
for(int i=0; i<50; i++)
{
for(int j=0; j<3; j++)
System.out.print(gmatrix[i][j]+"\t");
System.out.println("");
}
}
catch(Exception e)
{
e.printStackTrace();
}
finally
{
try
{
if(br != null)
br.close();
}
catch(Exception e)
{
e.printStackTrace();
}
}
}
public static void main(String[] args)
{
Viterbi v = new Viterbi("rules.txt");
}
}
这是文本文件的内容:
S;a;S;0.6
S;b;X;0.4
X;c;$;0.1
X;X;$;0.9
我希望输出显示在gmatrix中:
S a s
S b X
X c $
X X $
但由于某种原因,我得到以下输出和异常:
i --> 0 j--> 0: S
i --> 0 j--> 1: a
i --> 0 j--> 2: S
i --> 0 j--> 3: 0.6
java.util.NoSuchElementException
at java.util.StringTokenizer.nextToken(StringTokenizer.java:349)
at Viterbi.<init>(Viterbi.java:27)
at Viterbi.main(Viterbi.java:62)
如何根据需要打印正确的输出?
答案 0 :(得分:0)
在您的代码中,您只在hasNextToken()
条件开始时调用while
一次。 您需要与nextToken()一起调用hasNextToken()
次,以确保nextToken()
能够正常工作。你没有更多令牌的原因是每行只有4个令牌(显然),但你有两个for循环,试图调用nextToken()
总共 50 * 4 = 200 次。
除了你如何做到这一点:你可以将currentLine
分开“;”使用split()
方法,然后遍历返回的String[]
元素。
答案 1 :(得分:0)
在第一个while循环中,您实际上是通过解析输入文件的一行来尝试填充整个gmatrix
。这不是你所期望的。由于第一行中只有4个令牌,因此当您尝试调用st.nextToken()
以在程序尝试获取gmatrix[1][0]
时获取下一个(不存在的)令牌时,会出现异常。< / p>
要更正代码,您应该检查并阅读第一个for(int i = ...)
循环中的新输入行,并删除最多2个while
循环。
示例:
for(int i = 0; ...){
// check if there is another line in input;
// tokenize a line of input;
for(int j = 0; ...){
// get a token and populate one element in gmatrix;
}
}
而不是使用两个while
循环。