【问题标题】:Counting the amount of times each letter shows in a file计算每个字母在文件中显示的次数
【发布时间】:2017-10-13 17:09:20
【问题描述】:

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

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 的突出显示部分时,我看到它指的是我创建的字符串。我做错了什么,我能做些什么来解决它?

【问题讨论】:

    标签: java bluej


    【解决方案1】:

    你用来读取数据的方法应该和你用来检查是否有更多数据的方法是同一类型的。

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

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

    【讨论】:

      【解决方案2】:

      不保证,但请尝试在您的while 中使用inputFile.hasNext() 而不是inputFile.hasNextLine()。下一个 line 可用不一定与下一个 word 可用。

      【讨论】:

        【解决方案3】:

        您不需要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;
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2016-05-22
          • 2020-07-23
          • 2016-01-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多