文件排序 - 扫描仪 - 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的主要内容,如果未能解决你的问题,请参考以下文章

35 扫描目录下的文件和目录并进行排序输出

Mysql - ORDER BY详解

高速排序--双边扫描与单边扫描的实现

扫描仪扫描文件处理之scan_remove_image_exif.py

排序算法 -- 选择排序(java)

mysql使用索引扫描来做排序