You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

哈夫曼编码器文件读取报错: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 14:20:28