文件排序 - 扫描仪 - java.util.NoSuchElementException
Posted
技术标签:
【中文标题】文件排序 - 扫描仪 - java.util.NoSuchElementException【英文标题】:File Sorting - Scanner - java.util.NoSuchElementException 【发布时间】:2017-07-22 06:11:06 【问题描述】:/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package filesort;
import java.io.File;
import java.util.Scanner;`enter code here`
import java.io.IOException;
import java.util.Comparator;
import java.util.Collections;
import java.util.ArrayList;
import java.io.PrintWriter;
/**
*/
/**
* @param args the command line arguments
*/
class recordInfo
int studentNumber;
String firstName;
public recordInfo(int studentNumber,String firstName)
this.studentNumber = studentNumber;
this.firstName = firstName;
class firstNameCompare implements Comparator<recordInfo>
@Override
public int compare(recordInfo t, recordInfo t1)
return t.firstName.compareTo(t1.firstName);
class studentNumberCompare implements Comparator<recordInfo>
@Override
public int compare(recordInfo t, recordInfo t1)
return t.studentNumber - t1.studentNumber;
public class FileSort
public static void main(String[] args) throws IOException
File newfile = new File("student_record.txt");
// try
// PrintWriter output = new PrintWriter(newfile);
// output.println("72" + "\t" +"James");
// output.println("56" + "\t" +"Mark");
// output.println("87" + "\t" +"John");
// output.println("30" + "\t" +"Phillip");
// output.println("44" + "\t" +"Andrew");
// output.close();
//
//
// catch(IOException ex)
// System.out.printf("error \n", ex);
//
//
try
Scanner input = new Scanner(newfile);
try (PrintWriter output = new PrintWriter(newfile))
ArrayList<recordInfo> allRecords = new ArrayList<>();
String record = input.next();
while (input.hasNext())
String[] oneRecord = record.split(" ");
int studentNumber = Integer.valueOf(oneRecord[0]);
String firstName = oneRecord[1];
allRecords.add(new recordInfo(studentNumber, firstName));
//System.out.printf("%s %s \n", studentNumber, firstName);
Collections.sort(allRecords, new studentNumberCompare());
for (recordInfo RecordInfo : allRecords)
output.println(RecordInfo.firstName);
output.println("\t" +RecordInfo.studentNumber);
output.println("\n");
System.out.println(" " + RecordInfo.studentNumber + " " + RecordInfo.firstName);
output.close();
catch(IOException ex)
System.out.printf("error \n", ex);
基本上,该代码是按学生编号升序排列名为 student_records.txt 的文件中的记录。现在,我收到此错误:
线程“main”中的异常 java.util.NoSuchElementException at java.util.Scanner.throwFor(Scanner.java:907) 在 java.util.Scanner.next(Scanner.java:1416) 在 filesort.FileSort.main(FileSort.java:79) Java 结果:1
另外,student_records.txt 是空的。 :/ 有人可以帮助我吗?
【问题讨论】:
异常已修复,但文本文件排序后为空。 【参考方案1】:尝试更改:
String record = input.next();
while (input.hasNext())
到:
while (input.hasNext())
String record = input.next();
【讨论】:
谢谢。这修复了错误,但我的文本文件仍然是空的。 ://try (PrintWriter output = new PrintWriter(newfile))
行删除了student_record.txt
的内容。所以你应该把它移到Collections.sort(allRecords, new studentNumberCompare());
行之前。
谢谢,我已经修复了,但现在出现格式错误:java.lang.NumberFormatException: For input string: "72 James"
您可能需要写input.useDelimiter("\n");
或input.useDelimiter("\r\n");
。
也谢谢你。我现在已经修复了它,并且我的新文件已正确排序和格式化。祝你有美好的一天。【参考方案2】:
移动
try (PrintWriter output = new PrintWriter(newfile))
就在输出循环之前,即在扫描之前清空文件
并将 Scanner 更改为 BufferedReader(来自 FileReader)并使用 readline,因为 Scaner 接下来会给 onla 一个令牌。
【讨论】:
对不起,我不知道你的意思。像这样? >>>>Collections.sort(allRecords, new studentNumberCompare()); PrintWriter 输出 = 新 PrintWriter(newfile); for (recordInfo RecordInfo : allRecords) 好的,这是下一个错误,Scanner.next() 给你下一个标记(一开始是学号),而不是下一行。 谢谢。所以我用这个 String record = input.nextLine(); 修复了它但是现在出现格式错误。 :/ java.lang.NumberFormatException: For input string: "72 James" 我不是已经将字符串转换为 int 了吗? 分割不成功,可能72后的char不是空格? 是的,你是对的,它是一个标签“\t”,如果它是一个标签而不是空格,我该怎么做才能修复它?以上是关于文件排序 - 扫描仪 - java.util.NoSuchElementException的主要内容,如果未能解决你的问题,请参考以下文章