需要一些帮助来解决这个问题。 我想将data.txt中的数据输入到bsorted.txt中,并使用bubbleSort进行排序。
我需要在数据文件中生成随机数字和字母,然后将它们读入数组,并在排序到另一个文本文件后输出这些数据。
我收到了NoSuchElementException
:
Exception in thread "main" java.util.NoSuchElementException: No line found at java.util.Scanner.nextLine(Unknown Source) at SortingExample.main(SortingExample.java:257)
代码:
class dataFile {
public static void dataFile() {
try {
PrintWriter writer = new PrintWriter("data.txt");
String alphaNumerics = "qwertyuiopasdfghjklzxcvbnm1234567890";
String t = "";
for (int i = 0; i < 2000; i++) {
t += alphaNumerics.charAt((int) (Math.random() * alphaNumerics.length()));
}
writer.println(t);
writer.close();
}
catch(Exception ex) {
System.out.println("Error accessing file.");
System.out.println("Reason was: "+ex.getMessage());
ex.printStackTrace();
}
}
}
class SortingExample {
public static void main(String[] args) throws IOException {
dataFile.dataFile();
Scanner bscan = new Scanner(new File("data.txt"));
PrintWriter bsorted = new PrintWriter("bsorted.txt");
StringType[] strings = new StringType[2000];
for (int i = 0; i < strings.length; i++){
strings[i] = new StringType(bscan.nextLine());
}
Sort.bubbleSort(strings);
bsorted.println("Bubble Sort number of comparisons: " + Sort.bubbleComp + "\r\n" + "Bubble Sort number of exchanges: " + Sort.bubbleEx + "\r\n");
for (int i = 0; i < strings.length; i++) {
bsorted.println(strings[i].toString());
}
bsorted.close();
}
}
任何人都有一些想法可以帮助我吗?
答案 0 :(得分:0)
在继续通过扫描仪阅读下一行之前,您需要检查Scanner.hasNextLine()
是否为真。这有助于您确定是否安全地到达了文件结束标记。
因此,您的for loop
将是:
for (int i = 0; i < strings.length; i++) {
if (bscan.hasNextLine())
strings[i] = new StringType(bscan.nextLine());
}
或者,在您的尝试中处理它并捕获NoSuchElementException
try {
for (int i = 0; i < strings.length; i++) {
strings[i] = new StringType(bscan.nextLine());
}
} catch (NoSuchElementException ex) {
// Do Nothing
}
答案 1 :(得分:0)
在我看来,循环比你文件中的行更多次。
你的data.txt文件中可能只有不到2000行,但for循环仍然试图绕过2000次,每次都从该文件中读取另一行。
我建议你弄清楚data.txt中有多少行,并多次绕过for-loop。
尝试使用此代码确定行数:
LineNumberReader lnr = new LineNumberReader(new FileReader(new File("data.txt")));
lnr.skip(Long.MAX_VALUE);
然后你所要做的就是绕过lnr.getLineNumber()
次循环。
答案 2 :(得分:0)
根据您的代码:
for (int i = 0; i < 2000; i++) {
t += alphaNumerics.charAt((int) (Math.random() * alphaNumerics.length()));
}
writer.println(t);
writer.close();
看起来您将所有内容追加到一个字符串中,并将其作为一个大行写出来。换句话说,你有2000个元素连接成一个字符串。
你的扫描仪正在寻找2000行,所以当它只看到一行时就会失败。
我的建议是写出如下几行:
for (int i = 0; i < 2000; i++) {
t = alphaNumerics.charAt((int) (Math.random() * alphaNumerics.length()));
writer.println(t);
}
writer.close();
偏离主题,但有许多约定让我从OO角度暂停,例如小写类名(dataFile),非动词类的方法名(dataFile)