2014-06-29 55 views
4

我的任務是編寫一個方法,該方法應該結合連續出現兩次以上的字母。例如:ABBCCCDDDD - > ABBC3D4爲什麼代碼跳過for循環

我被告知我們該庫的In.java和Out.java用於輸入和輸出。我的問題是該方法跳過for循環。我希望你能幫助我。如果您有任何關於代碼的問題請問我請

public class Aufgabe9_4 { 
    static void codieren(String s){ 
     int Zähler = 0; 
     char[] a = s.toUpperCase().toCharArray(); 
     for (int i = 0; i<s.length()-1; i++){ 
      if (a[i] == a[i+1] && a[i] ==a[i+2]){ 
       Zähler = 3; 
       while (a[i] == a[i+Zähler]) Zähler++; 
       i = i + Zähler; 
      } 
      Out.println(a[i] + Zähler); 
     } 
    } 
    public static void main(String args[]) { 
     Out.println("Geben sie eine Reihenfolge von Buchstaben ein!"); 
     String s = In.readString(); 
     Out.println("Die Codierung lautet:"); 
     codieren(s); 
    } 
} 
+0

你是怎麼進入程序暫停輸入時? –

+3

請不要在你的語法中使用元音變音! – Daniel

+1

我們不是德語的人 –

回答

2

我已校正碼,並得到預期的結果:ABBC3D4

  • 所有數組訪問必須在陣列範圍內。當您訪問[i+2]時,請確保您的i值始終爲< length-2。 (換句話說,你所訪問的索引(i+2)必須始終< length

  • 隨着循環,這是一個有點麻煩,因爲[i+Zähler]還必須< lengthZähler可以是任何值。爲此,我添加了(i+Zähler) < s.length()作爲支票。它必須在a[i] == a[i+Zähler]之前,因爲它需要先評估。

  • 同樣適用於您的原始代碼:i = i + Zähler。你超過1,所以我不得不添加- 1。它確保print(a[i])不會失敗,通過否定最近的Zähler++的影響。

  • println(a[i] + Zähler)將打印的a[i]數字總和與Zähler加入(一值是在心臟的整數)。顯然,這不是你想要的,所以我把它分開。

  • 我還添加了支票if (Zähler != 0),因爲您不想打印零。

  • print功能代替println打印在同一行上。

  • 我在下面的代碼中沒有更正的東西:當您在for循環中訪問數組時,循環參數應該更好地使用該數組的長度。所以正確的,你應該使用a.length,而不是s.length()

  • 別的東西:嘗試使用String.charAt()重寫程序。

工作程序在Ideone here (link)

static void codieren(String s){ 
    int Zähler = 0; 
    char[] a = s.toUpperCase().toCharArray(); 
    for (int i = 0; i<s.length()-2; i++){ 
     if (a[i] == a[i+1] && a[i] ==a[i+2]){ 
      Zähler = 3; 
      while ((i+Zähler) < s.length() && a[i] == a[i+Zähler]) { 
       Zähler++; 
      } 
      i = i + Zähler - 1; 
     } 
     System.out.print(a[i]); 
     if (Zähler != 0) { 
      System.out.print(String.valueOf(Zähler)); 
     } 
    } 
} 
+1

非常感謝!你的解釋確實幫助了我。 – user3788064

+0

不客氣@ user3788064 ...除了接受外,還請接受。 ':)' – ADTC

+0

增加投票需要15或更高的聲望。我害怕我不能那樣做ADTC – user3788064

1

這真的是一個評論,但我需要包括格式化輸出和代碼。

我認爲這個問題可能是由於一個異常而導致程序失敗的一個組合,以及一個輸出方法在異常時沒有顯示之前的輸出。

我使用的System.out.println輸出基於所述問題源代碼的程序,並得到:

65 
66 
66 
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 10 
    at Test.codieren(Test.java:8) 
    at Test.main(Test.java:18) 
71 

ArrayIndexOutOfBoundsException異常意味着你試圖通過訪問使用的索引的陣列的範圍外0長-1,使用索引不存在,在這種情況下,10

我的修改方案是:

public class Test { 
    static void codieren(String s) { 
    int Zähler = 0; 
    char[] a = s.toUpperCase().toCharArray(); 
    for (int i = 0; i <= s.length() - 1; i++) { 
     if (a[i] == a[i + 1] && a[i] == a[i + 2]) { 
     Zähler = 3; 
     while (a[i] == a[i + Zähler]) 
      Zähler++; 
     i = i + Zähler; 
     } 
     System.out.println(a[i] + Zähler); 
    } 
    } 

    public static void main(String args[]) { 
    String s = "abbcccdddd"; 
    codieren(s); 
    } 
} 
+1

只是爲了澄清:這段代碼仍然會導致ArrayIndexOutOfBoundsException。 – laune

+0

@laune是的 - 我沒有試圖修復循環邏輯,只是爲了清楚說明循環正在執行。 –

1

你的打印語句打印NE xt字符而不是打印當前字符。 你必須:

  • 打印A [1]您檢查occurances之前
  • 設置Zaeler的默認值設爲1。

因此,這是你的方法應該如何看起來像:

static void codieren(String s){ 
    char[] a = s.toUpperCase().toCharArray(); 
    for (int i = 0; i<s.length()-1; i++){ 
     int Zähler = 1;   
     Out.print(a[i]); 
     if (a[i] == a[i+1] && a[i] ==a[i+2]){ 
      Zähler = 3; 
      while (a[i] == a[i+Zähler]) Zähler++; 
      i = i + Zähler; 
     } 
     Out.println("(" + Zähler + ")"); 
    } 
} 
1

我將通過編寫一個程序來統計數組中的字符的連續occurances開始,

private static int countOccur(char[] arr, int st, int end) { 
    final char ch = arr[st]; // 'st' is start. 
    int count = 1; 
    for (; count < end - st; count++) { // <-- don't exceed the array boundary 
    if (ch != arr[st + count]) { // <-- break if not the same character 
     break; 
    } 
    } 
    return count; // <-- return the count 
} 

接下來,我會修改codieren(String)以返回String(而不是void,使呼叫者顯示結果 - 例如,關注點分離),

static String codieren(String s) { 
    if (s == null) { // <-- handle corner cases. 
    return null; 
    } 
    StringBuilder sb = new StringBuilder(); // <-- for building the return String. 
    char[] a = s.toUpperCase().toCharArray(); 
    for (int i = 0; i < a.length;) { // <-- we will increment by occurrences. 
    int occur = countOccur(a, i, a.length); // <-- get the occurrences count. 
    if (occur > 2) { // <-- 3 or more are LETTER then COUNT. 
     sb.append(a[i]).append(occur); 
    } else { // <-- Must be 2 or fewer. 
     for (int t = 0; t < occur; t++) { 
     sb.append(a[i]); 
     } 
    } 
    i += occur; // <-- increment 'i'. 
    } 
    return sb.toString(); // <-- return the result. 
} 
+0

感謝您的幫助:) – user3788064

1

下面是使用「回溯」,這是IMHO更易於維護(長度截止不是回溯算法掃描階段的一部分)的替代算法。

步驟:

  1. 掃描通過人物
  2. 每當有一個 '變',決定如何處理序列 availlable做直到現在
  3. 繼續掃描

這將工作分爲兩部分......「掃描邊緣」和「表示最後一個序列」,可以用模塊化方式編碼。

public static String getCollapsed(String inString) { 
    char[] chars = inString.toUpperCase().toCharArray(); 
    StringBuilder sb = new StringBuilder(inString.length()); 
    char curChar = ' '; 
    char lastChar = ' '; 
    int lastCount = 0; 
    for (int i = 0; i < chars.length; i++) { 
     curChar = chars[i]; 
     if (i != 0) { 
      if (curChar != lastChar) { 
       sb.append(getRepresentation(lastChar, lastCount)); 
       lastCount = 0; 
      } 
     } 
     lastChar = curChar; 
     lastCount++; 
    } 
    sb.append(getRepresentation(lastChar, lastCount)); 
    return sb.toString(); 
} 

private static String getRepresentation(char c, int count) { 
    String s = ""; 
    if (count == 1) s = "" + c; 
    else if (count == 2) s = "" + c + c; 
    else s = "" + c + count; 
    return s; 
} 

public static void main(String[] args) { 
    System.out.println(getCollapsed("AAAABCCDDDD")); 

} 
+0

感謝您的幫助!當我有更多的時間可變時,我將需要考慮您的解決方案。 – user3788064

+0

@ user3788064編輯它...現在更模塊化。 – Teddy

1

怎麼樣使用兩種田地

i = 0; 
counter = 0; 
currentchar=s[0] 
stringbuffer outputstr; 

while i < s.length 
    { 
    while s[i]==currentchar and i < s.length 
    { 
     counter +=1; 
     i+=1; 
    } 

    if (counter== 1) 
     { outputstr.append(currentchar); } 
    elseif (counter==2) 
     { outputstr.append(currentchar); 
     outputstr.append(currentchar); 
     } 
    else 
     { outputstr.append(currentchar); 
     outputstr.append(counter.toString); 
     } 

    currentchar = s[i]; 
    counter = 0; 
    } 
+0

它是否提供了預期的結果?如果是這樣,它也是一個很好的解 – user3788064

+0

是的,是嗎,你可以試試:) – user3785757