计算每个字母在文件中出现的次数

Counting the amount of times each letter shows in a file

本质上,此代码获取一个文件(几段文本)并计算每个字母出现的次数并将其打印到控制台上。虽然我已经完成了计算方面的所有代码,但我 运行 遇到了异常。当我 运行 这个时,它显示:

java.util.NoSuchElementException

at java.util.Scanner.throwFor(Scanner.java:862)
at java.util.Scanner.next(Scanner.java:1371)
at LetterCount.countOccurrences(LetterCount.java:29)
at LetterCount.main(LetterCount.java:20)

这是我的代码:

// Document your class here

import java.util.Scanner;
import java.io.File;
import java.io.FileInputStream;
public class LetterCount {

public final static String FILENAME = "testFile.txt";

// Driver to test LetterInventory class
public static void main(String[] args) {
    Scanner inputFile = null;
    try {
        inputFile = new Scanner(new File(FILENAME));
    } catch (Exception e) { 
        System.out.println("File could not be opened: " + FILENAME);
        System.exit(0);
    }

    int[] counts = countOccurrences(inputFile);
    displayTable(counts);
    resetTable(counts);  
}

public static int[] countOccurrences (Scanner inputFile) {
    int[]counts = new int[26];
    char[] characters = {'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'};
    while (inputFile.hasNextLine()) {
        String theWord = inputFile.next();
        theWord = theWord.toLowerCase();

        for (int j = 0; j < theWord.length(); j++) {
            for (int counter = 0; counter < 26; counter++) {
                if (theWord.charAt(j) == characters[counter]) {
                    counts[counter] += 1;
                }

            }
        }
    }
    return counts;
}

public static void displayTable (int[] counts) {
    for (int index = 0; index < 26; index++) {
        System.out.println((char)('a' + index) + ":\t" + counts[index]);
    }
}

public static void resetTable (int[] counts) {
    System.out.println();
    for (int index = 0; index < 26; index++) {
        System.out.println((char)('a' + index) + ":\t0");
    }
}
}  

当我单击 NoSuchElementException 的突出显示部分时,我看到它指的是我创建的字符串。我做错了什么,我该如何解决?

没有保证,但请尝试在 while 中使用 inputFile.hasNext() 而不是 inputFile.hasNextLine()。下一个可用与下一个可用不一定是一回事。

您用来读取数据的方法应该与您用来检查是否有更多数据的方法类型相同。

在你的 while 语句中,你使用了 inputFile.hasNextLine(),所以在它后面的那一行,你应该使用 inputFile.nextLine()(而不是像现在这样使用 inputFile.next())。

或者,您可以将 while 语句更改为使用 inputFile.hasNext()

您不需要 characters 数组(您可以使用显示中的相同数学来执行 counts 的加法)。此外,您应该与调用 Scanner.hasNextLine()Scanner.next() 的方式保持一致(使用 hasNext() 检查下一个)。像,

public static int[] countOccurrences(Scanner inputFile) {
    int[] counts = new int[26];
    while (inputFile.hasNext()) {
        String theWord = inputFile.next().toLowerCase();
        for (char ch : theWord.toCharArray()) {
            if (Character.isLetter(ch)) {
                counts[ch - 'a']++;
            }
        }
    }
    return counts;
}