1

我正在尝试编写一个程序来读取多个文件并逐行比较它们。要读取的文件数量取自用户,文件预计为“input1.txt”、“input2.txt”等形式。

当我尝试运行我的代码时,我得到一个“NoSuchElementException”,告诉我 Scanner.nextLine() line: line not avaialble。这是在第 50 行,即:jthLine.add(myScanners.get(k - 1).nextLine());. 我不知道为什么没有要读取的行,因为这已经在一个以最小行数为界的循环中完成了。

任何帮助表示赞赏!这是我的代码:

// Compares n input files, prints the lines that are not equal in all.

import java.util.Scanner;
import java.io.*;
import java.util.ArrayList;
import java.util.Collections;

public class CompareFiles {
public static void main(String[] args) throws IOException {
    Scanner consoleScanner = new Scanner(System.in);
    int numberOfFiles;
    System.out.println("Please enter how many files are there. The" +
            "file names should be like: input1.txt input2.txt, etc.");
    numberOfFiles = consoleScanner.nextInt();

    ArrayList<Scanner> myScanners = new ArrayList<Scanner>();

    for (int k = 1; k <= numberOfFiles; k++)
        myScanners.add(new Scanner(new File("input" + k + ".txt")));

    // Find the file line counts.
    ArrayList<Integer> lineCounts = new ArrayList<Integer>();
    Integer lineCount;
    String increment;

    for (int i = 1; i <= numberOfFiles; i++) {
        lineCount = 0;

        while (myScanners.get(i - 1).hasNext()) {
            increment = myScanners.get(i - 1).nextLine();
            lineCount++;
        }

        lineCounts.add(lineCount);
    }

    // Find the minimum file count.
    int minLineCount = Collections.min(lineCounts);

    // Compare files until minLineCount line by line
    // println all the unmatching lines from all files
    // jthLine holds the incremented lines from all files
    ArrayList<String> jthLine = new ArrayList<String>();
    boolean allMenAreTheSame;

    for (int j = 1; j <= minLineCount; j++) {
        allMenAreTheSame = true; // are all jth lines the same?

        for (int k = 1; k <= numberOfFiles; k++) {
            jthLine.add(myScanners.get(k - 1).nextLine());

            if (!jthLine.get(0).equals(jthLine.get(k)))
                allMenAreTheSame = false;
        }

        if (!allMenAreTheSame) {
            System.out.println();
            System.out.println("Line number " + j + " is not the same" + 
            "across all files, printing the lines:");

            for (int k = 1; k <= numberOfFiles; k++) {
                System.out.println("File: \"input" + k + ".txt\":");
                System.out.println(jthLine.get(k - 1));
            }
        }

        jthLine.clear();
    }
}

}

4

1 回答 1

1

您收到此错误的原因是因为在计算扫描仪对象myScanners.get(i - 1)到达文件末尾的行数时。因此,当您再次尝试从中读取时,它会从您离开的位置开始,即文件末尾。

有不同的方法,但我认为最简单的方法是创建新的扫描仪对象。

 for (int i = 1; i <= numberOfFiles; i++) {
        lineCount = 0;

        while (myScanners.get(i - 1).hasNext()) {
            increment = myScanners.get(i - 1).nextLine();
            lineCount++;
        }

        lineCounts.add(lineCount);
    }

 myScanners.clear()

 for (int k = 1; k <= numberOfFiles; k++)
        myScanners.add(new Scanner(new File("input" + k + ".txt")));

 // Find the minimum file count.
int minLineCount = Collections.min(lineCounts);
于 2012-11-17T00:50:52.457 回答