public class LZW{
public static final int R=256;
public static final int L=4096;
//编码
public static String encode(String input){
//初始化字典
Map<String,Integer> dictionary=new HashMap<>();
for (int i=0;i<R;i++){
dictionary.put(""+(char) i,i);
}
String pre="";
StringBuilder result=new StringBuilder();
for (char c:input.toCharArray()){
String nextSting=pre+c;
if (dictionary.containsKey(nextSting)){
pre=nextSting;
}else {
//将当前字符串编码输出到结果集中
String s=dictionary.get(pre)+",";
result.append(s);
if(dictionary.size()<L){
dictionary.put(nextSting,dictionary.size());
}
pre=""+c;
}
}
result.append(dictionary.get(pre));//将最后一个字符串编码添加到结果中
return result.toString();
}
//解码
public static String decode(String encodeData){
//将输入的字符串转化为数组
String[] strArray=encodeData.split(",");
int[] intArray=new int[strArray.length];
for (int i=0;i< strArray.length;i++){
intArray[i]=Integer.parseInt(strArray[i]);
}
Map<Integer,String> dictionary=new HashMap<>();
for (int i=0;i<R;i++){
dictionary.put(i,""+(char) i);
}
StringBuilder result=new StringBuilder();
String pre;
String output= dictionary.get(intArray[0]);
result.append(output);
//逐个读取数据编码
for (int i=1;i< intArray.length;i++){
int code=intArray[i];
pre=output;
output=dictionary.get(code);
pre=pre+output.charAt(0);
dictionary.put(dictionary.size(), pre);
result.append(output);
}
return result.toString();
}
public static void main(String[] args) {
String input = "abbabac"; // 假设这是要进行LZW编码的输入数据
String encodedData = encode(input);
System.out.println("编码后的数据:" + encodedData);
String decodeData=decode(encodedData);
System.out.println("解码后的数据为:"+decodeData);
}
}
lzw算法的Java实现
最新推荐文章于 2024-04-07 04:20:33 发布