【Java】编写一个方法,实现基本的字符串压缩功能

利用重复字符出现的次数,编写一个方法,实现基本的字符串压缩功能。

例如,字符串aabcccccaaa会变为a2b1c5a3。若压缩后的字符串没有变短,则返回原先的字符串。

StringBuffer:

如果频繁地对字符串进行拼接,直接用“+”的话会建立很多String型的对象,对服务器资源和性能是不小的开销,例如下面的代码:

	public String compressBad (String str)
	{
		String mystr = " ";
		int count = 1;
		char last = str.charAt(0);
		for (int i = 1; i < str.length(); i++)
		{
			if (last == str.charAt(i))
			{
				count++;
			}
			else
			{
				mystr += last + count;
				last = str.charAt(i);
				count = 1;				
			}
		}
		return mystr += last + count;
	}


其实这种情况下可以使用StringBuffer。StringBuffer量随着内部存储的字符串长度而翻倍增大,会先建立一个能容纳所有字符的数组,容等拼接完成再将这些字符串转成一个字符串。而且StringBuffer比起StringBuilder是线程安全的。

public String compressBetter (String str)
	{
		StringBuffer mystr = new StringBuffer();
		int count = 1;
		char last = str.charAt(0);
		for (int i = 1; i < str.length(); i++)
		{
			if (last == str.charAt(i))
			{
				count++;
			}
			else
			{
				mystr.append(last);
				mystr.append(count);
				last = str.charAt(i);
				count = 1;				
			}
		}
		mystr.append(last);
		mystr.append(count);
		
		int size = countCompression(mystr.toString());
		if (size > str.length())
		{ return str; }
		else
		{ return mystr.toString(); }
	}
	
	int countCompression(String urstr)
	{
		if (urstr.isEmpty() || urstr == null) return 0;		
		char last = urstr.charAt(0);
		int size = 0;
		int count = 1;
		for (int i = 1; i < urstr.length(); i++)
		{
			if (urstr.charAt(i) == last)
			{count ++;}
			else 
			{
				last = urstr.charAt(i);
				size += 1 + String.valueOf(count).length();
			}
		}
		return size;
	}
}


阅读更多
个人分类: java
想对作者说点什么? 我来说一句

字符串压缩与解压 java

2011年10月28日 3KB 下载

没有更多推荐了,返回首页

不良信息举报

【Java】编写一个方法,实现基本的字符串压缩功能

最多只允许输入30个字

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭