行程編碼RLE java實現

多媒體佈置了一到行程編碼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();
    }
}

接受各位大佬熱心指點。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章