文本文件中字母的频率。产量小

时间:2019-07-14 21:20:47

标签: java loops for-loop while-loop

因此,该方法应该读取文本文件并输出每个字母的频率。文本文件显示为:

  • aaaa
  • bbb
  • cc

所以我的输出应该是:

  • a = 4
  • b = 3
  • c = 2

不幸的是,我的输出是:

  • a = 4
  • a = 4
  • b = 3
  • a = 4
  • b = 3
  • c = 2

有人知道为什么吗?

我尝试修改循环,但仍未解决。

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());
            }


    }
}

2 个答案:

答案 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());

我希望这个答案能够解释为什么要获得该特定输出