【问题标题】:How to make a frequency histogram in java如何在java中制作频率直方图
【发布时间】:2019-04-14 14:35:05
【问题描述】:

我正在尝试创建一个读取文件并打印出以下内容的代码:

  • 文件行数
  • 每个字母出现的频率
  • 每个非字母字符的频率

我想为字母和数字的频率创建一个直方图,但我似乎无法找到解决方案。如果有什么我希望输出看起来像这样:

A ***** - 5
B *** - 3
C ******* - 7

我的输出如下所示:

*********************
*********************
*********************
A 263
B 130
C 50

等等

【问题讨论】:

  • 您的文件内容是什么样的?如果我知道您要阅读的内容,我会为您提供帮助。
  • 它只是一个包含许多信息段落的文件 - 想象一下从维基百科页面复制和粘贴几个段落
  • 哦。我误读了。现在我懂了。您正在尝试读取字母的数量。你遇到了什么问题?
  • 什么不起作用?您可以使用 Java 8 流 API 并查找字数统计示例。将每个单词平面映射到字符然后获取字符数只是又一步
  • 在遍历文件的字符时不要打印星星。当您打印每个字符的出现次数时,在循环结束后打印它们。

标签: java histogram frequency


【解决方案1】:

这就是你完成任务的方式。它计算小写字母的数量并打印除频率之外的星星,就像您想要的那样。

这是通用代码(paragraph 是包含文件内容的字符串):

int[] lettercount = new int[26];
for(int i = 0; i < 26; i++){
    //Set every single number in the array to 0.
    lettercount[i] = 0;
}

for(char s : paragraph.toCharArray()){
    int converted = (int) s;
    converted -= 97;
    if(converted >=0 && converted <=25){
        lettercount[converted] += 1;
    }
}

//Print out the letter with the frequencies.
for(int i = 0; i < 26; i++){
    char convertback = (char) (i+97);
    String stars = "";
    for(int j = 0; j < lettercount[i]; j++){
        stars += "*";
    }
    System.out.println(convertback + " " + stars + " - " + lettercount[i]);
}

这应该适用于小写字母。如果你想做大写字母,lettercount[] 应该是 52 个元素。您还必须检查 converted (在第二个 for 循环中),减去 97 后是否为负数,如果是,则加回 58。

我希望这会有所帮助!如果您有任何问题,请在下方评论。

【讨论】:

  • 非常感谢!我做了一点修改,效果很好,非常感谢!
  • 不客气!如果您发现此答案有用,请点赞或接受它作为答案,以便其他人在遇到类似问题时可以参考。
  • 谢谢你,我很高兴能为你提供帮助!
  • 一些事情。首先,这看起来很像一个家庭作业问题,我鼓励@masterandomguy 做他自己的工作。其次,这个解决方案依赖于如何为字符分配数字的细节(- 97 位),实际上并不是一个很好的演示。它根本不处理非拉丁字符,例如 é 将不会被正确计算。我建议改用Map,也许还可以使用一组您想要报告的默认字符。
  • 是的,正如 Yona 所说,我最初考虑使用带有字符键和整数值的映射。这样做的方法是您将获取角色并检查您的地图中是否有一对具有相同的键。如果没有,您将添加字符和值 1。如果这对确实存在,您将获取与该字符关联的值,将其递增,然后将其添加回地图。为了您的目的,计算英文字母,我认为当前的解决方案就足够了。如果您想计算 á 等非英文字母或 '!' 等符号,地图将非常有用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-11
  • 2017-12-23
  • 2014-03-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多