剥いだ布団とメモランダム.old

情報系のことをかいてゆく

Javaで単純な文字列圧縮プログラム

プログラミングの練習として簡単な文字列圧縮プログラムをつくってみた。
まあそんなに難しくなかったけど、最近javaをやってなかったので、少し時間が…

で、どんな感じのプログラムよ?

文字の連続する数を数えて、数字に置き換えてしまうという超単純文字列圧縮です。
例えば、

aaaabbbは、a4b3

に変換したいわけです。


あと、圧縮後の結果が元の文字列よりも短くならないときは、
元の文字列を返すようにしてみます。

書いてみた

ソースコード

package src;
import java.util.Scanner;
public class Compresser {
	public static String compress(String src){
		int counter=0, srcLen = src.length();
		String result="", prev="", c="";
		boolean firstFlag = true;
		for (int i=0; i<srcLen; i++){
			c = src.substring(i, i+1);
			if (firstFlag){
				firstFlag = false;
				prev = c;
			}
			if (!c.equals(prev)){
				if (counter>0){
					result += prev + counter;
					counter = 0;
				}
			}
			prev = c;
			counter++;
		}
		result += c + counter;
		if (srcLen > result.length())return result;
		return src;
	}
	
	public static void main(String[] args) {
		Scanner stdIn = new Scanner(System.in);
		String src;
		System.out.print("input String");
		src = stdIn.next();
		src = compress(src);
		System.out.println(src);
	}
}

入力された文字列に対して、Stringクラスないのsubstringメソッドを使って各文字を確認しています。
読み込んだ文字に対して前の文字との比較を行なって、同じであれば1を足して文字数をチェックしています。

気をつけなければいけないのは、最初の1文字目の処理だけは前の文字というものがないので、firstFlagというboolean型のフラグを使って、別処理をしてあげています。

実行結果

まずは普通に圧縮がされるパターン

input String aaaabbb
a4b3

大丈夫そうですね。

次は圧縮をしてはいけないパターン

input String aabcdef
aabcdef

これも、okです。

ただし、実はこのプログラムは部分的に圧縮することを想定していないので、

input String abababbbba
abababbbba

こういう場合は、bbbbの部分だけを圧縮すればいいんですが、プログラムはすべて圧縮か全く圧縮しないかという挙動なので、こんな感じになってしまいます。(ごめんね!)

雑感

まあ、先も言ったとおり、部分的な圧縮に対応していないとか、数字を入力したらわけわからなくなるとか、そもそものアルゴリズム的な部分でツッコミどころがあるけども、まあ文字列のちょっとした処理の勉強にはなったかなと。
正規表現とかあんまり文字列処理らしいことはやってないです。さーせん)

符号化プログラムもやってみたら面白いかなあ。
暑くなった頃にクーラーかけながらやるかもしれない。