我正在进行AP CS分配,其中一条指令要求我将文本文件中的每一列数据读入一个独立的一维数组。到目前为止我还没弄清楚,可以使用一些建议/帮助。当我尝试运行程序时,我也得到错误“java.util.InputMismatchException null(在java.util.Scanner中)
1980 Aug 945 100 Allen
1983 Aug 962 100 Alicia
1984 Sep 949 100 Diana
1985 Jul 1002 65 Bob
1985 Aug 987 80 Danny
1985 Sep 959 100 Elena
上面是文本文件,下面是我目前正在使用的代码。
import java.util.Scanner;
import java.io.File;
import java.io.IOException;
public class Hurricanes2
{
public static void main(String[] args)throws IOException
{
//declare and initialize variables
File fileName = new File("hurcdata2.txt");
Scanner inFile = new Scanner(fileName);
int arrayLength = 59;
int [] year = new int[arrayLength];
String [] month = new String[arrayLength];
int [] pressure = new int[arrayLength];
int [] windSpeed = new int[arrayLength];
//INPUT - read data in from the file
int n = 0;
while (inFile.hasNext())
{
year[n] = inFile.nextInt();
month[n] = inFile.next();
pressure[n] = inFile.nextInt();
windSpeed[n] = inFile.nextInt();
System.out.println (year[n] + "\n");
n++;
}
inFile.close();
答案 0 :(得分:1)
你文件的每一行都有5个项目,但你的代码只读取第一行4.所以当它认为它开始下一行时,它实际上是在尝试读取当前行的最后一项,这是不 int
。
一种解决方案是阅读每一行的第五项,即使您没有任何需要存储的地方。
答案 1 :(得分:1)
查看输入数据
1980 Aug 945 100 Allen
1983 Aug 962 100 Alicia
1984 Sep 949 100 Diana
你在抓什么:
while (inFile.hasNext())
{
year[n] = inFile.nextInt();
month[n] = inFile.next();
pressure[n] = inFile.nextInt();
windSpeed[n] = inFile.nextInt();
System.out.println (year[n] + "\n");
n++;
}
输入中有5个字段,你只是抓取4.当它第二次循环时,它希望获取年份(int)而不是抓取名字(字符串)。
答案 2 :(得分:1)
您没有选择while
循环中的最后一列。因此,在第二个循环中,扫描程序尝试将第5列作为int读取。
即使您不使用结果,也必须在inFile.next()
循环结束时添加while
,因此扫描程序不会在下一循环中移位。
答案 3 :(得分:0)
您同时拥有String
和int
,因此,要么始终要求String
(并稍后将其解析为int
),或者,如果您知道您的文件的格式,您可以使用它对您有利。在您的示例中,您有int
,String
,int
,int
,String
,然后换行。
从这里你可以通过多种方式解决问题。
一个解决方案意味着使用Scanner
来读取整行,然后使用String
的方法.split(String regex )
,我们创建一个字符串数组,我们现在可以解析。但是,要使正确工作的方法,您需要在分隔文本的方式上保持一致。在我的例子中,我使用了tab。我使用了你的例子并将它们全部标记出来。我不会在这里显示,因为编辑器不会保存标签。
File fileName = new File("hurcdata2.txt");
int arrayLength = 6; //I used 6 since you showed 6 lines
//You could use an ArrayList or an algorithm to dynamically
//increase the size of the arrays.
int [] year = new int[arrayLength];
String [] month = new String[arrayLength];
int [] pressure = new int[arrayLength];
int [] windSpeed = new int[arrayLength];
Scanner fileScanner = null;
try {
fileScanner = new Scanner( fileName );
}
catch ( FileNotFoundException ex ) {
//Exception handling;
}
int n = 0;
while( fileScanner.hasNext() ) {
String toParse = fileScanner.nextLine();
String[] splitedString = toParse.split( "\t" );
year[n] = Integer.parseInt( splitedString[0] );
month[n] = splitedString[1];
pressure[n] = Integer.parseInt( splitedString[2] );
windSpeed[n] = Integer.parseInt( splitedString[3] );
n++;
}
fileScanner.close();
//I will include my test to check it.
for ( int i = 0 ; i < arrayLength; i++ ) {
System.out.print( "\ni: " + i );
System.out.print( " - year: " + year[i] );
System.out.print( "; month: " + month[i] );
System.out.print( "; pressure: " + pressure[i] );
System.out.println( "; windSpeed: " + windSpeed[i] );
}
另一种解决方案是使用StringReader
代替.split( String regex );
。 StringReader
就像Scanner
,但它专注于字符串。
您还可以使用FileReader
中包含的BufferedReader
来读取文件。
FileReader myFileReader = null;
BufferedReader myBufferedReader = null;
try {
myFileReader = new FileReader( fileName );
myBufferedReader = new BufferedReader( myFileReader );
int n = 0;
String toParse = null;
while( (toParse = myBufferedReader.readLine()) != null ) {
//Is this confusing for you? ^
String[] splitedString = toParse.split( "\t" );
year[n] = Integer.parseInt( splitedString[0] );
month[n] = splitedString[1];
pressure[n] = Integer.parseInt( splitedString[2] );
windSpeed[n] = Integer.parseInt( splitedString[3] );
n++;
}
}
catch ( FileNotFoundException ex ) {
//Exception handling;
}
catch ( IOException ex ) {
//Exception handling;
}
finally {
try {
myFileReader.close();
}
catch ( IOException ex ) {
//Exception handling;
}
try {
myBufferedReader.close();
}
catch ( IOException ex ) {
//Exception handling;
}
}
我希望我有所帮助。
祝你有个愉快的一天。 :)