while(sc.hasNextLine()) {
for (int i=0; i<trainingData.length; i++) {
String[] line = sc.nextLine().trim().split(" ");
您不能只检查扫描仪一次以查看它是否有数据,然后使用循环来读取数据行。您不能仅仅因为定义数组来保存 48 行数据就假设您有 48 行数据。
您需要回到基础知识并学习如何一次一行地从文件中读取数据,然后处理该数据。
这是一个帮助您入门的简单示例:
import java.util.*;
public class ScannerTest2
{
public static void main(String args[])
throws Exception
{
String data = "1 2\n\n3 4\n\n5 6\n7 8";
// First attempt
System.out.println("Display All Lines");
Scanner s = new Scanner( data );
while (s.hasNextLine())
{
String line = s.nextLine();
System.out.println( line );
}
// Second attempt
System.out.println("Display non blank lines");
s = new Scanner( data );
while (s.hasNextLine())
{
String line = s.nextLine();
if (line.length() != 0)
{
System.out.println( line );
}
}
// Final attempt
String[][] values = new String[5][2];
int row = 0;
System.out.println("Add data to 2D Array");
s = new Scanner( data );
while (s.hasNextLine())
{
String line = s.nextLine();
if (line.length() != 0)
{
String[] digits = line.split(" ");
values[row] = digits;
row++;
}
}
for (int i = 0; i < values.length; i++)
System.out.println( Arrays.asList(values[i]) );
}
}
该示例使用 String 变量来模拟文件中的数据。
第一个代码块是如何简单地从文件中读取所有数据行。逻辑很简单:
- 调用
hasNextLine()
方法所以看看是否有数据
- 调用
nextLine()
获取数据行的方法
- 显示读取到的数据
- 重复步骤1-3,直到没有数据为止。
然后下一个代码块只需添加一个“if 条件”,以便仅显示非空白数据。
最后,第三个代码块更接近您想要的。当它读取每一行数据时,它将数据分割成一个数组,然后将该数组添加到二维数组中。
这是您需要更改的代码部分。在将字符串数组添加到二维数组之前,您需要将其转换为双精度数组。因此,首先更改此代码以使其正常工作。然后,一旦您理解了这个概念,就可以对您的实际应用程序进行必要的更改。
请注意我的代码中最后一行如何显示 [null, null]。这就是为什么使用数组不是一个好主意,因为你永远不知道数组应该有多大。如果少于 5 个,则会得到空值。如果超过 5 个,您将收到越界异常。