我正在尝试从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);
}
如何让它工作,所有字母都计算在内? }
答案 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]
将是a
或A
的计数,而letterCount[2]
将是b
或B
<的计数/ 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();
}
}
}