1. 程式人生 > >【Java】編寫一個方法,實現基本的字串壓縮功能

【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;
	}
}