检查不同排序算法的性能。我们得到了一个包含 500,000 个单词的 .txt 文件,这些文件将使用这些算法进行排序。我编写了读取文件并将单词存储在字符串数组中的方法。第一个
Scanner
计算行数,第二个 Scanner
使用计数器创建数组,但它只适用于行数少得多的文件。我不能真正分享文本文件的内容,它只是一个每行包含 1 个单词的文件。
当我尝试读取包含 500,000 行的文件时,我得到:
线程“main”中的异常 java.util.NoSuchElementException
在 java.base/java.util.Scanner.throwFor(Scanner.java:937)
在 java.base/java.util.Scanner.next(Scanner.java:1478)
在 Tester.readArray(Tester.java:81)
在 Tester.main(Tester.java:7)
你觉得是我的电脑不支持,还是我需要换个方法? 这是我的方法:
public static String[] readArray(String file) {
int wordCounter = 0;
try {
Scanner s1 = new Scanner(new File(file));
while (s1.hasNextLine()) {
wordCounter = wordCounter + 1;
s1.next();
}
s1.close();
String[]words = new String[wordCounter];
Scanner s2 = new Scanner(new File(file));
for (int i = 0; i < wordCounter; i = i + 1) {
words[i] = s2.next();
}
return words;
}
catch (FileNotFoundException e) {
}
return null;
}
所以对我来说用
hasNextLine()
替换hasNext()
修复了异常。这与您的 PC 无关。
我认为当您的文件末尾有一个空行时,可能会发生此错误。因为,当我在文件末尾删除我正在读取的空行时,没有抛出异常。
Scanner 的 hasNextLine() 方法检查输入中是否还有另一行,无论该行是否为空,而 hasNext() 使用定界符检查另一个标记。使用 hasNext() 可能会解决您的问题。检查此以获取更多信息hasNext()与hasNextLine()
但是,您正在使用 Scanner 类的 nextLine() 来获取总行数。这对于中小型文件可能很有效,但可能不适用于无法放入内存的超大文件。
public static long countLines(String file) {
try {
return Files.lines(Paths.get(file)).parallel().count();
} catch (IOException e) {
e.printStackTrace();
return -1;
}
}
该方法使用parallel()方法创建一个并行的行流,通过使用多个线程并行处理行,可以提高大文件的性能。