从txt文件计算字母字符的出现次数

时间:2016-08-25 11:46:19

标签: java

我正在尝试从txt文件中读取字母表中每个字母的出现次数。到目前为止,我的代码只计算字母a - 成功。

int counter = 0;
    try (BufferedReader reader = new BufferedReader(new FileReader(file))) {
        int ch;
        for (char a : "ABCDEFGHIJKLMNOPQRSTUVWXYZ".toCharArray()) {

            char toSearch = a;
            counter = 0;
            while ((ch = reader.read()) != -1) {
                if (a == Character.toUpperCase((char) ch)) {
                    counter++;
                }
            }
            System.out.println(toSearch + " occurs " + counter);

        }

如何让它工作,所有字母都计算在内?         }

3 个答案:

答案 0 :(得分:3)

你遇到的问题是你正在阅读整个文件,比较第一个字母和第二个字母时没有文件。

不是使用嵌套循环,而是可以增加值数组中的元素,每个字母对应一个元素。 e.g。

int[] letterCount = new int[27];
for (int ch; (ch = reader.read()) != -1; ) {
    if ((ch >= 'A' && ch <= 'Z') || (ch >= 'a' && ch <= 'z'))
        letterCount[ch % 32]++; // update the counter for the letter.
}

在这种情况下,letterCount[1]将是aA的计数,而letterCount[2]将是bB <的计数/ p>

答案 1 :(得分:1)

暴力逻辑:

  • 要阅读的文件。readAllLines() / Loop = FileReader + BufferedReader 文件中的行。

  • 对于读取的每一行,将其转换为小写(我们不想单独计算A和a),获取char数组。 创建地图

  • 迭代char数组并为每个char检查它是否已经存在 出现在地图上。如果不存在,请将其添加到地图中 如果key存在,请获取值,将1加1并放入 价值回归

答案 2 :(得分:1)

您的问题出现在缓冲的阅读器中。每次调用reader.read()时,它都会移动到下一个字符,所以当你的循环结束时,它已经读到了文件的末尾。 在for循环结束时,您需要重置缓冲的阅读器以再次指向文件的开头。 为了做到这一点,您需要创建一个新的缓冲读取器对象,如果您只是将行BufferedReader reader = new BufferedReader(new FileReader(file))移动到for循环之后,您的代码将起作用。

public class Test {
public static void main(String [] args) {

    File file = new File("test.txt");
    int counter = 0;
    try {

        int ch;
        for (char a : "ABCDEFGHIJKLMNOPQRSTUVWXYZ".toCharArray()) {
            BufferedReader reader = new BufferedReader(new FileReader(file));
            char toSearch = a;
            counter = 0;

            while ((ch = reader.read()) != -1) {
                if (a == Character.toUpperCase((char) ch)) {
                    counter++;
                }
            }
            System.out.println(toSearch + " occurs " + counter);

        }
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }

}

}