2017-06-25 50 views
1

我在寫一個程序,它使用運行長度編碼來壓縮字符串。程序來壓縮字符串

E.g.對於輸入「aaabbccccddd」,輸出應該是「a3b2c4d3」。

目前該程序沒有顯示輸出。

public static void main(String[] args) { 
    String words1 = "aabbbcccc"; 
    String words2 = compress(words1); 
    System.out.println(words2); 
    } 

private static String compress(String w1) { 
    StringBuilder w2 = new StringBuilder(); 
    int k = 0; 
    for (int i = 0; i < w1.length();) { 
     k++; 
     if(i+1>w1.length() || w1.charAt(i) != w1.charAt(i+1)) { 
      w2.append(w1.charAt(i)); 
      w2.append(k); 
      k = 0; 
     } 
    } 
    return ((w2.length() > w1.length())? w1: w2.toString()); 
} 

輸出在IntelliJ中沒有顯示任何內容,我找不出原因!也試過沒有StringBuilder。即使在沒有StringBuilder的情況下嘗試,並且在處理String時出現問題,並將退貨類型更改爲void。同樣,沒有結果。

+1

瞭解如何使用IDE的調試器。您可以查看程序的內部運作情況並找出錯誤的位置。 – Henry

回答

1

正如埃倫說,你忘了i++部分。另外,i+1>w1.length()應該是i+1>=w1.length()。它應該適應這兩個變化。

private static String compress(String w1) { 
    StringBuilder w2 = new StringBuilder(); 
    int k = 0; 
    for (int i = 0; i < w1.length(); i++) { 
     k++; 
     if(i+1>=w1.length() || w1.charAt(i) != w1.charAt(i+1)) { 
      w2.append(w1.charAt(i)); 
      w2.append(k); 
      k = 0; 
     } 
    } 
    return ((w2.length() > w1.length())? w1: w2.toString()); 
} 
+0

謝謝。我不知道我是如何錯過增量,並導致我瘋狂的混亂! –

3

你忘了的一件事是你的for循環中的i++。這會導致無限循環。

除此之外,你的循環條件有問題。它應該是i<w1.length()-1以避免IndexOutOfBoundsExceptionw1.charAt(i+1)引起。

一旦你改變了,你會看到String的最後一個字符沒有被處理。你可以在循環之外處理它。

private static String compress(String w1) { 
    StringBuilder w2 = new StringBuilder(); 
    int k =0; 
    for (int i=0; i < w1.length()-1; i++) { 
    k++; 
    if (w1.charAt(i) != w1.charAt(i+1)) { 
     w2.append(w1.charAt(i)); 
     w2.append(k); 
     k=0; 
    } 
    } 

    w2.append (w1.charAt (w1.length()-1)); 
    w2.append (k+1); 

    return ((w2.length() > w1.length())? w1: w2.toString()); 
} 

此輸出

a3b2c4d3 

爲輸入

aaabbccccddd 

編輯:

正如David正確的評論,你有代碼來處理循環中的最後一個字符。您在if聲明中剛剛進行了錯誤的範圍檢查。

下修復所有問題,而不需要單獨處理的最後一個字符:

private static String compress(String w1) { 
    StringBuilder w2 = new StringBuilder(); 
    int k =0; 
    for (int i=0; i < w1.length(); i++) { 
    k++; 
    if (i+1 >= w1.length() || w1.charAt(i) != w1.charAt(i+1)) { 
     w2.append(w1.charAt(i)); 
     w2.append(k); 
     k=0; 
    } 
    } 

    return ((w2.length() > w1.length())? w1: w2.toString()); 
} 
+0

我不認爲你完全理解OP的代碼。最後一個字符應該由'i + 1> w1.length()'部分在循環內部處理(由於在解決方案中不需要它,因此忘記刪除它)。問題是它應該是'i + 1> = w1.length()'。這應該防止「IndexOutOfBoundsException」。 –

+0

@DavidKnipe好點。我錯過了。 – Eran