关闭

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

1358人阅读 评论(0) 收藏 举报
分类:

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

例如,字符串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;
	}
}


0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:120063次
    • 积分:3100
    • 等级:
    • 排名:第11586名
    • 原创:180篇
    • 转载:107篇
    • 译文:0篇
    • 评论:10条
    文章分类
    最新评论