【问题标题】:Read in a file and print out letter frequency读入文件并打印出字母频率
【发布时间】:2016-11-29 15:50:24
【问题描述】:

我刚刚开始一项关于霍夫曼编码的作业。第一步是实现某种形式的文件处理,读取要处理的文件,然后对字符进行频率计数。

我有几个不同的文本文件来测试这个 - 有些是字母、数字、符号、大写、小写等。

这是我目前所拥有的:

import java.io.*;
public class LetterFrequency {
int nextChar;
char c;
public static void main(String[] args) throws IOException {
   File txtfile = new File("10000random.txt");
   BufferedReader in = new BufferedReader (new FileReader (txtfile));
       System.out.println("Letter Frequency:");

    int[] count = new int[26];

    while ((nextChar = in.read()) != -1) {
      ch = ((char) nextChar);
      if (ch >= 'a' && ch <= 'z')
      count[ch - 'a']++;
    }


    for (int i = 0; i < 26; i++) {
      System.out.printf("%c %d", i + 'A', count[i]);
    }



in.close();

}

这显然是一个基本版本(仅处理 a-z),我将如何更改它以包含所有大写字母、数字、符号等。似乎不必猜测数组的大小。

抱歉,如果这是一个明显的问题,我仍在学习! 谢谢

【问题讨论】:

  • 为什么不为大写、小写、数字、符号等创建不同的数组?
  • 或者你可以使用 map 来存储它而不需要知道你遇到的字符
  • @nafas 但这不会使字符保持字典顺序。
  • @RafiduzzamanSonnet 问题没有指定对字符进行排序,地图旁边可以排序但是需要排序...
  • 没有文本,只有编码文本。如果将文件作为文本文件提供,则还必须提供用于制作它们的字符编码,然后使用该编码(例如 UTF-8)通过文本库(例如 Scanner)读取它们。无论如何,如果您使用 Java 的 StringCharacterchar,您的代码必须处理 UTF-16 代码单元,代表 Unicode 代码点,代表 graphemes。或者,将文件作为字节序列并对字节值执行频率计数可能要简单得多。

标签: java frequency huffman-code


【解决方案1】:

您是否同时支持单字节和双字节字符?只有 ASCII 字符?

如果只有 ascii,你有 (26 * 2) + 10 个可能的值来覆盖所有的小写、大写和数字。

如果您覆盖的不仅仅是 ascii,则可以使用 Map 而不是数组。

Map<Integer, AtomicInteger> map = new HashMap<>();
...
map.computeIfAbsent(ch, c -> new AtomicInteger()).getAndIncrement();

【讨论】:

    【解决方案2】:
    String letterAsString = (ch+"").toUpperCase();
    

    如果您想以与小写字母相同的方式计算它们,这是一个解决方案。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-08-30
      • 1970-01-01
      • 1970-01-01
      • 2021-05-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多