多媒體佈置了一到行程編碼RLE。。。然後我百度了發現居然沒有java的實現方式。然後我就來獻醜下。用來造福人類(學弟學妹們).可能代碼冗餘很大,還有很多地方值得優化的。等空閒來也行我會來優化下。
先來看下結果
默認字符串是不帶#的字符串。(如果包含其實也行加個轉移符就行,我懶得優化了)4位以上(包括4位就開始壓縮)
格式是重複的字符+#+重複字符的數量+#
import java.util.*;
public class Compression
{
public static void main(String[] argc)
{
Scanner cin=new Scanner(System.in);
String code=cin.next().trim();
lengthCoding(code);
huffmancoding(code);
}
private static void lengthCoding(String src)
{
String result=runLengthCoding(src);
System.out.println("行程編碼");
System.out.println("原字符串:"+src);
System.out.println("壓縮字符:"+result);
System.out.println("解壓字符:"+runLengthCoding_read(result));
}
//行程編碼加密
private static String runLengthCoding(String src)
{
src=src+"#";//最後填一個#用於方便最後一個before可以輸出
List<String> result=new ArrayList<String>();//存放結果
List<Character> temp=new ArrayList<Character>();//存放臨時變量和數數
char before=src.charAt(0);//前後字符參照對比
for(int i=1;i<src.length();i++)
{
if(src.charAt(i)==before)//相同都暫時存放在temp裏
{
temp.add(before);
}
else
{
if(temp.size()>=3)//加上before一共4位
{
result.add(temp.get(0)+"#"+(temp.size()+1)+"#");//before沒有加進去所以大小要加1
}
else
{
if(temp.isEmpty())
{
result.add(String.valueOf(before));
}
else
{
StringBuilder temp2=new StringBuilder();
temp2.append(temp.get(0));
for(int j=1;j<temp.size();j++)
{
temp2.append(temp.get(j));
}
temp2.append(before);
result.add(temp2.toString());
}
}
temp=new ArrayList<Character>();
}
before=src.charAt(i);
}
//生成字符串
StringBuilder answer=new StringBuilder(result.get(0));
for(int i=1;i<result.size();i++)
{
answer.append(result.get(i));
}
return answer.toString();
}
//行程編碼解密
private static String runLengthCoding_read(String src)
{
char before=src.charAt(0);
StringBuilder result=new StringBuilder();
for(int i=1;i<src.length();i++)
{
if(src.charAt(i)=='#')
{
StringBuilder temp=new StringBuilder();
i++;
while(src.charAt(i)!='#')
{
temp.append(src.charAt(i));
i++;
}
int length=Integer.parseInt(temp.toString());
for(int j=0;j<length;j++)
{
result.append(before);
}
if(i<src.length()-1)//特殊情況特殊處理。此處應該可以優化掉。但是沒空了。。
{
before=src.charAt(++i);
if(i==src.length()-1)
result.append(before);
}
}
else
{
result.append(before);
before=src.charAt(i);
if(i==src.length()-1)//特殊情況特殊處理。此處應該可以優化掉。但是沒空了。。
result.append(before);
}
}
return result.toString();
}
}
接受各位大佬熱心指點。