【Java】編寫一個方法,實現基本的字串壓縮功能
阿新 • • 發佈:2019-01-08
利用重複字元出現的次數,編寫一個方法,實現基本的字串壓縮功能。
例如,字串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; } }