哈夫曼编码器文件读取报错:NumberFormatException问题求助
问题分析与解决方案
错误根源
从报错栈追踪可以明确:程序在HuffmanNode构造方法中尝试将字符串"R"解析为Double类型,触发了NumberFormatException。这说明你的fileToHeap方法逻辑完全错误——它错误地将文件中的字符内容当作节点权重(数值)来处理,而哈夫曼树的核心是基于字符出现频率创建节点。
解决方案
需要重构fileToHeap方法,先统计文件中每个字符的出现频率,再用<字符, 频率>对创建HuffmanNode;同时确保HuffmanNode的构造方法能正确接收字符和频率参数。
1. 修改HuffmanNode类的构造方法
确保构造方法接收字符数据和对应的权重(频率):
public class HuffmanNode { char data; double weight; HuffmanNode left; HuffmanNode right; // 正确的构造方法:接收字符和权重 public HuffmanNode(char data, double weight) { this.data = data; this.weight = weight; this.left = null; this.right = null; } }
2. 重构fileToHeap方法
修改为读取文件字符、统计频率、生成节点堆的逻辑:
import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; import java.util.HashMap; import java.util.Map; import java.util.PriorityQueue; public class HuffmanTree { // 重构后的fileToHeap方法 private static PriorityQueue<HuffmanNode> fileToHeap(String filename) throws IOException { Map<Character, Integer> frequencyMap = new HashMap<>(); // 读取文件并统计字符频率 BufferedReader reader = new BufferedReader(new FileReader(filename)); int charCode; while ((charCode = reader.read()) != -1) { char ch = (char) charCode; // 跳过文件中的空格(如果空格是字符分隔符而非目标字符) if (ch == ' ') { continue; } // 更新频率统计 frequencyMap.put(ch, frequencyMap.getOrDefault(ch, 0) + 1); } reader.close(); // 创建优先队列,按权重(频率)升序排序 PriorityQueue<HuffmanNode> heap = new PriorityQueue<>((node1, node2) -> Double.compare(node1.weight, node2.weight) ); // 遍历频率Map,创建HuffmanNode并加入队列 for (Map.Entry<Character, Integer> entry : frequencyMap.entrySet()) { heap.add(new HuffmanNode(entry.getKey(), entry.getValue())); } return heap; } // 你的main方法只需确保正确调用fileToHeap即可,无需额外修改(前提是原main逻辑是基于堆构建哈夫曼树) public static void main(String[] args) throws IOException { if (args.length != 1) { System.out.println("Usage: java HuffmanTree <filename>"); return; } PriorityQueue<HuffmanNode> heap = fileToHeap(args[0]); // 后续构建哈夫曼树的逻辑... } }
3. 适配你的输入文件
你的EE.txt内容是"E R R O R",上述代码会自动跳过空格,统计出:
- E: 1次
- R: 3次
- O: 1次
并以此创建对应的哈夫曼节点,避免数值解析错误。
内容的提问来源于stack exchange,提问作者CodersLife2
相关产品推荐
相关产品推荐

