为什么代码会跳过for循环

时间:2014-06-29 16:31:52

标签: java for-loop

我的任务是编写一个方法,该方法应该组合连续出现两次以上的字母。示例:ABBCCCDDDD - > ABBC3D4

我被告知我们库的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);
    }
}

6 个答案:

答案 0 :(得分:2)

我已更正代码并获得了您期望的结果:ABBC3D4

  • 所有数组访问都必须在数组范围内。当您访问[i+2]时,请确保i值始终为< length-2。 (换句话说,您要访问的索引(i+2)必须始终为< length。)

  • 使用 while 循环时,它有点棘手,因为[i+Zähler]也必须是< length,但Zä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的数字和( char 值为整数> )。显然这不是你想要的,所以我把它分开了。

  • 我还添加了支票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 :(得分: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表示您尝试使用不存在的索引(在本例中为10)使用0到length-1范围之外的索引访问数组。

我修改的程序是:

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

答案 2 :(得分:1)

您的print语句打印下一个char而不是打印当前的char。 你必须:

  • 在检查发生之前打印[i]
  • 将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 + ")");
    }
}

答案 3 :(得分:1)

我首先编写一个例程来计算数组中字符的连续出现次数,

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.
}

答案 4 :(得分:1)

这是一种使用&#34; lookback&#34;的替代算法。哪个恕我直言更容易维护(长度截止不是回顾算法中扫描阶段的一部分)。

步骤:

  1. 扫描字符
  2. 每当有“更改”时,请确定如何处理序列 至今可以使用
  3. 继续扫描
  4. 这将工作分成两部分......&#34;扫描边缘&#34;和&#34;代表最后一个序列&#34;它可以以模块化方式编码。

    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"));
    
    }
    

答案 5 :(得分: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;
  }