我正在尝试解码霍夫曼代码。
我得到了一个chars字典,带有一个int值,一个二进制值和单词的二进制值,它看起来像这样:
10,000; 121,001; 13,010; 33,011; 100,1000; 32,1001; 104,1010; 101,1011; 111,1100; 108,1101; 119,1110; 114,1111; 1010101100110011110110011111101100001000011011010000
...,其中like10 - 121 -13 -33
和other的数字是字符的int值,在它们旁边是char的二进制值,然后1和0的序列是代码消息。
从文件txt中读取它之后,我将其拆分为字符串数组,这样我就可以拥有一个以char为键,以二进制值为值的哈希图。
然后,将其保存在节点数组中,这样我就可以轻松地将它们放置起来,问题是这样的:
当我尝试使用字典将二进制消息转换为char时,收到如下消息:
1!y1y111!y11111!
何时应该是这样:
嘿,世界!
这是我正在使用的方法:
void decompress() throws HuffmanException, IOException {
File file = FilesManager.chooseUncompressedFile();
if (file == null) {
throw new HuffmanException("No file");
}
FileReader read = new FileReader(file);
BufferedReader buff = new BufferedReader(read);
String auxText;
StringBuilder compressFromFile = new StringBuilder();
do {
auxText = buff.readLine();
if (auxText != null) {
compressFromFile.append(auxText);
}
} while (auxText != null);
String[] auxSplit1 = compressFromFile.toString().split(" ");
String rest1 = auxSplit1[1];
String[] auxSplit2 = rest1.split(";");
System.out.println(auxSplit2[2]);
HashMap<Integer, String> map = new HashMap<>();
String[] tomapAux;
for (int i = 0; i < auxSplit2.length - 2; i++) {
tomapAux = auxSplit2[i].split(",");
map.put(Integer.valueOf(tomapAux[0]), tomapAux[1]);
}
ArrayList<CharCode> charCodeArrayList = new ArrayList<>();
map.forEach((k, v) -> charCodeArrayList.add(new CharCode((char) k.intValue(), v)));
charCodeArrayList.sort(new Comparator<CharCode>() {
@Override
public int compare(CharCode o1, CharCode o2) {
return extractInt(o1.getCode()) - extractInt(o2.getCode());
}
int extractInt(String s) {
String num = s.replaceAll("\\D", "");
return num.isEmpty() ? 0 : Integer.parseInt(num);
}
});
这就是我在控制台中看到的内容:
因此,如果有人可以帮助我改善我的方法,以便我能获得ahey world!!
而不是 1!y1y111!y11111! !!01
,那就太好了!
慕侠2389804
相关分类