首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用霍夫曼代码表Java解码bitString

使用霍夫曼代码表Java解码bitString
EN

Stack Overflow用户
提问于 2018-11-09 04:11:20
回答 1查看 1K关注 0票数 0

目标是使用霍夫曼代码表将bitString转换为纯文本,

代码语言:javascript
复制
r=000
h=001
o=01
w=100
d=1010
e=1011
l=11

我将霍夫曼代码表存储在两个不同的String[]数组中:

代码语言:javascript
复制
String[] ch = {"r", "h", "o", "w", "d", "e", "l"};
String[] b = {"000", "001", "01", "100", "1010", "1011", "11"};

根据霍夫曼代码表,以下bitString等同于字符串"helloworld“。

代码语言:javascript
复制
String bits = "001101111110110001000111010";

现在我想循环遍历每组位,以便匹配其对应的字符:

代码语言:javascript
复制
StringBuilder sb = new StringBuilder();

for(int i = 0; i < bits.length(); i++) {
    if(bits.substring(0, b[i].length()).equals(b[i])) {
        sb.append(ch[i]);
        bits = bits.substring(b[i].length());
    }
}

这里的问题是,每次找到匹配项时,我都找不到“重置”循环并返回b[0]的方法,这样我就可以从头开始检查b[i]

EN

回答 1

Stack Overflow用户

发布于 2018-11-09 04:29:30

你需要“一位一位”地读入源数据,并且每次检查它是否是一个有效的霍夫曼代码。我建议使用Map而不是数组(或者你可以设置一个树结构,然后一步一步地遍历它),否则性能会变得非常慢,因为大多数时候你必须遍历整个数组的每一位。

下面是一个使用huffman代码表的示例:

代码语言:javascript
复制
import java.util.HashMap;


public class HuffmanDecoder {
    private static HashMap<String, String> huffMap = new HashMap<>();

    static {
        huffMap.put("000", "r");
        huffMap.put("001", "h");
        huffMap.put("01", "o");
        huffMap.put("100", "w");
        huffMap.put("1010", "d");
        huffMap.put("1011", "e");
        huffMap.put("11", "l");
    }

    public final static void main(String[] args) {
        char[] bits = "001101111110110001000111010".toCharArray();

        StringBuffer result = new StringBuffer();
        StringBuffer temp = new StringBuffer();
        for (int i = 0; i < bits.length; i++) {
            temp.append(bits[i]);
            String val = huffMap.get(temp.toString());
            if (val == null) {
                continue;
            }
            result.append(val);
            temp.setLength(0);
        }

        System.out.println(result);
    }
}

一旦找到有效代码,就将相应的解码值添加到结果缓冲器中,并重置临时缓冲器。缺少的是一些错误处理,当接收的数据不会导致有效的代码值,但其实现依赖于实际代码,例如,对于SFF数据(传真图像),解码器继续读取,直到它到达行尾标记。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53215416

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档