因此,该方法应该读取文本文件并输出每个字母的频率。文本文件显示为:
所以我的输出应该是:
不幸的是,我的输出是:
有人知道为什么吗?
我尝试修改循环,但仍未解决。
public void getFreq() throws FileNotFoundException, IOException, Exception {
File file = new File("/Users/guestaccount/IdeaProjects/Project3/src/sample/testFile.txt");
BufferedReader br = new BufferedReader(new FileReader(file));
HashMap<Character, Integer> hash = new HashMap<>();
String line;
while ((line= br.readLine()) != null) {
line = line.toLowerCase();
line = line.replaceAll("\\s", "");
char[] chars = line.toCharArray();
for (char c : chars) {
if (hash.containsKey(c)){
hash.put(c, hash.get(c)+1);
}else{
hash.put(c,1);
}
}
for (Map.Entry entry : hash.entrySet()){
System.out.println(entry.getKey() + " = " + entry.getValue());
}
}
}
答案 0 :(得分:0)
只需将打印循环移到读取循环之外即可。
public void getFreq() throws FileNotFoundException, IOException, Exception {
File file = new File("/Users/guestaccount/IdeaProjects/Project3/src/sample/testFile.txt");
BufferedReader br = new BufferedReader(new FileReader(file));
HashMap<Character, Integer> hash = new HashMap<>();
String line;
while ((line= br.readLine()) != null) {
line = line.toLowerCase();
line = line.replaceAll("\\s", "");
char[] chars = line.toCharArray();
for (char c : chars) {
if (hash.containsKey(c)){
hash.put(c, hash.get(c)+1);
}else{
hash.put(c,1);
}
}
}
for (Map.Entry entry : hash.entrySet()){
System.out.println(entry.getKey() + " = " + entry.getValue());
}
}
答案 1 :(得分:0)
克里斯文·杰姆(Chrisvin Jem)为您提供了更改代码,因为从for
读取时,您的while
循环位于File
循环中。
有人知道为什么吗?
正如您的问题所述,我将解释为什么它会为您提供该输出。
原因:之所以为您提供a=4, a=4, b=3, a=4, b=3, c=3
输出,是因为您的for
循环位于您的while
循环中,这意味着每次BufferedReader
读了一行,您遍历了HashMap
并打印了其内容。
示例:当BufferedReader
读取文件的第二行时,HashMap hash
已经具有a
的键,值对,现在,它具有刚得到b
的值。结果,除了在读取第一行时已经打印了a
的值之外,它还打印了HashMap
的当前内容,包括多余的a
。文件的第三行也发生同样的事情。
解决方案:通过将for
循环移出while
循环,您只需在HashMap
之后打印结果具有所有值,并且不是 HashMap
仍在获取值。
for (Map.Entry entry : hash.entrySet())
System.out.println(entry.getKey() + " = " + entry.getValue());
我希望这个答案能够解释为什么要获得该特定输出。