注意属性的类型,注意返回值得作用
package a;
import java.util.*;
public class HuffmanStringDemo {
public static void main(String[] args) {
String content = " i learn learn learn english and you you you";
byte[] bytes = content.getBytes();//将字符串变成字节,这样方便我们判断
System.out.println(bytes.length);
List<Huf> list = getList(bytes);
System.out.println(list);
List<Huf> tree = createTree(list);
if (tree.get(0) != null) {
tree.get(0).pre();
}else {
System.out.println("is null");
}
}
private static List<Huf> createTree(List<Huf> list) {//这个方法的返回值必须是这个lis
while (list.size() > 1) {
Collections.sort(list);
Huf left = list.get(0);
Huf right = list.get(1);
Huf parent = new Huf(null, left.count + right.count);
parent.left = left;
parent.right = right;
list.add(parent);
list.remove(left);
list.remove(right);
}
return list;
}
private static List<Huf> getList(byte[] bytes) {
ArrayList<Huf> list = new ArrayList<>();
HashMap<Byte, Integer> map = new HashMap<Byte, Integer>();
for (byte b : bytes) {
Integer count = map.get(b);
if (count == null) {//这个判断的目的就是看map中是否有这个值。
map.put(b, 1);
}else {
map.put(b, count + 1);
}
}//循环结束。map已经完成
for (Map.Entry<Byte, Integer> entry : map.entrySet()) {
list.add(new Huf(entry.getKey(),entry.getValue()));
}
return list;
}
}
class Huf implements Comparable<Huf>{
Byte value;//为了让key的值可以为null,用的Byte
int count;
Huf left;
Huf right;
public Huf(Byte value, int count) {
this.value = value;
this.count = count;
}
@Override
public String toString() {
return "Huf{" +
"value=" + value +
", count=" + count +
'}';
}
public void pre() {
System.out.println(this);
if (this.left != null) {
this.left.pre();
}
if (this.right != null) {
this.right.pre();
}
}
@Override
public int compareTo(Huf o) {
return this.count-o.count;
}
}
本文详细介绍了一种数据压缩算法——哈夫曼编码的实现过程。通过分析字符串中字符出现的频率,构建哈夫曼树,并以此为基础生成每个字符的哈夫曼编码,最终实现了字符串的高效压缩。
7302

被折叠的 条评论
为什么被折叠?



