# 压缩算法——lzw算法实现

step P C is PC in dic output P dictionary description
1 NULL a   初始化，不处理
2 a b no 1 ab:5 ab不存在dictionary中，扩充
3 b c no 2 bc:6
4 c b no 3 cb:7
5 b c yes     bc在dictionary中，P = PC
6 bc a no 6 bca:8
7 a b yes
8 ab c no 5 abc:9
9 c a no 3 ca:10
10 a b yes
11 ab c yes
12 abc d no 9
13 d NULL   4   结束

public List<Integer> encode(String data) {
List<Integer> result = new ArrayList<Integer>();

// 初始化Dictionary
int idleCode = 256;
HashMap<String, Integer> dic = new HashMap<String, Integer>();
for (int i = 0; i < 256; i++) {
dic.put((char) i + "", i);
}

String prefix = "";// 词组前缀
String suffix = "";// 词组后缀
for (char c : data.toCharArray()) {
suffix = prefix + c;
if (dic.containsKey(suffix)) {
prefix = suffix;
} else {
dic.put(suffix, idleCode++);
// System.out.println(dic.get(prefix));
prefix = "" + c;
}
}

// 最后一次输出
if (!prefix.equals("")) {
// System.out.println(dic.get(prefix));
}
return result;
}

public String decode(List<Integer> array) {

StringBuilder result = new StringBuilder();
int deCode = 256;
HashMap<Integer, String> dic = new HashMap<Integer, String>();
for (int i = 0; i < 256; i++) {
dic.put(i, (char) i + "");
}
String p = "";
String c = "";
for (int code : array) {

if (dic.containsKey(code)) {
c = dic.get(code);
} else if (code == deCode) {
c = c + c.charAt(0);
System.out.println("code == deCode");
} else {
}

if (!p.equals("")) {
dic.put(deCode++, p + c.charAt(0));
}

result.append(c);
this.write("lzw解压.txt", c);
p = c;
}
System.out.println("++++");
//		System.out.println(result);
return result.toString();
}

上面我们只是实现了对字符串的压缩和解压，如果想利用这个原理实现对文件的压缩，还需要加入对得到的数组队列的存储以及读写的方法

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客