gpt4 book ai didi

java - 将文件读入二维数组时出错

转载 作者:行者123 更新时间:2023-12-01 18:37:40 25 4
gpt4 key购买 nike

我有以下代码尝试确定文件的尺寸,但每次执行时都会出现此错误:

Exception in thread "main" java.util.NoSuchElementException
at java.util.Scanner.throwFor(Unknown Source)
at java.util.Scanner.next(Unknown Source)

我不知道为什么会发生这种情况。任何人都可以帮助调试问题吗?并解释为什么会发生?

public void loadDistances(String fname) throws Exception {
String file = fname;
File f = new File(file);
Scanner in = null;

try {
in = new Scanner(f);
}
catch (FileNotFoundException ex) {
System.out.println("Can't find file " + file);
System.exit(1);
}

int rows = 0;
int cols = 0;
int elements = 0;

while(in.hasNext()){
while(in.next() != null){
System.out.println(elements++);
}
in.nextLine();
rows++;
}
in.close();

cols = (elements + 1) / rows;

// for debug purposes
System.out.println(rows);
System.out.println(cols);
}

读取此文件

0 2 3.0
1 0 2.0
2 1 7.0
2 3 1.0
3 0 6.0

//检查建议答案

    int tokens = 0;
String line;
Scanner tokenScanner;
Scanner fileScanner;
Scanner lineScanner;

while(fileScanner.hasNextLine()){
line = fileScanner.nextLine();
lineScanner.nextLine() = line;
while(lineScanner.hasNext()){
tokens++;
}
rows++;
}

最佳答案

您在扫描循环中根本没有向变量分配任何数据,不仅如此,您还从扫描仪读取两次,同时仅检查一次数据一次 ,这是一件危险的事情。

while(in.hasNext()){                 // **** checking once ****
while(in.next() != null){ // **** read in and waste a token here!
System.out.println(elements++);
}
in.nextLine(); // **** read in and waste a line here
rows++;
}
in.close();

我愿意:

  • 使用两个扫描仪变量,其中一个是 fileScanner,读取文件中的每一行文本,...
  • 调用 lineScanner 来读取线路上的每个标记。
  • 我会使用外部 while 循环来检查 fileScanner.hasNextLine(),然后调用 nextLine() 将该行读入字符串中,例如称为
  • 然后,我将使用创建的 String 行创建一个新的 Scanner,并将其分配给 lineScanner 变量。
  • 我将使用一个内部 while 循环,该循环在 while lineScanner.hasNext() 中循环,并将数据读入您的变量中。
  • 我会在外部 while 循环结束时关闭内部 lineScanner,以免浪费资源。
<小时/>

或者,您可以使用 String#split(...) 拆分读入行中的标记,然后将字符串解析为数字。例如,

public List<RowData> loadDistances(String fname)
throws FileNotFoundException, NumberFormatException {
File file = new File(fname);
Scanner fileScanner = new Scanner(file);
List<RowData> rowList = new ArrayList<RowData>();

while (fileScanner.hasNextLine()) {
String line = fileScanner.nextLine();
String[] tokens = line.split("\\s+");
if (tokens.length != 3) {
// throw some custom exception
}

int rowNumber = Integer.parseInt(tokens[0].trim());
int xData = Integer.parseInt(tokens[1].trim());
double yData = Double.parseDouble(tokens[2].trim());
rowList.add(new RowData(rowNumber, xData, yData));
}

if (fileScanner != null) {
fileScanner.close();
}

return rowList;
}
<小时/>

编辑
通过使用行扫描仪,我建议创建第二个扫描仪,传入从第一个扫描仪获得的行,并从第二个扫描仪中提取数据。如果您不知道需要多少个标记,则可以使用 while 循环,但您的数据似乎定义良好,每行都包含一个 int、int 和 double,我们可以使用此信息来帮助我们提取正确的数据。您可以使用类似这样的代码:

 // use previous same code as above except in the while loop:
while (fileScanner.hasNextLine()) {
String line = fileScanner.nextLine(); // get line
Scanner lineScanner = new Scanner(line); // create Scanner with it
int rowNumber = 0;
int xData = 0;
double yData = 0.0;

if (lineScanner.hasNextInt()) {
rowNumber = lineScanner.nextInt();
} else {
// throw a custom exception since int not found
}
if (lineScanner.hasNextInt()) {
xData = lineScanner.nextInt();
} else {
// throw a custom exception since int not found
}
if (lineScanner.hasNextDouble()) {
yData = lineScanner.nextDouble();
} else {
// throw a custom exception since double not found
}

rowList.add(new RowData(rowNumber, xData, yData));

if (lineScanner != null) {
lineScanner.close();
}
}

关于java - 将文件读入二维数组时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21206777/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com