Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么代码跳过for循环_Java_For Loop - Fatal编程技术网

Java 为什么代码跳过for循环

Java 为什么代码跳过for循环,java,for-loop,Java,For Loop,我的任务是编写一种方法,将连续出现两次以上的字母组合在一起。示例:abbccdddd->ABBC3D4 有人告诉我们,库的In.java和Out.java用于输入和输出。我的问题是该方法跳过for循环。我希望你能帮助我。如果你对代码有任何问题,请问我 public class Aufgabe9_4 { static void codieren(String s){ int Zähler = 0; char[] a = s.toUpperCase().toC

我的任务是编写一种方法,将连续出现两次以上的字母组合在一起。示例:abbccdddd->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);
    }
}
公共类Aufgabe9_4{
静态void codieren(字符串s){
int Zähler=0;
char[]a=s.toUpperCase().toCharArray();

对于(inti=0;i这实际上是一个注释,但我需要包含格式化的输出和代码

我认为问题可能是由于一个异常导致的程序失败和一个输出方法在异常时没有显示先前的输出

我使用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);
  }
}
公共类测试{
静态void codieren(字符串s){
int Zähler=0;
char[]a=s.toUpperCase().toCharArray();

对于(inti=0;i您的print语句将打印下一个字符,而不是当前字符。 你必须:

  • 在检查事件之前打印[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 + ")");
    }
}
static void codieren(字符串s){
char[]a=s.toUpperCase().toCharArray();

对于(int i=0;i我将首先编写一个例程来计算数组中字符的连续出现次数

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
}

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

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

  • 对于while循环,它有点复杂,因为
    [i+Zähler]
    也必须是
    ,但是
    Zähler
    可以是任何值。为此,我添加了
    (i+Zähler)
    作为检查。它必须在
    a[i]==a[i+Zähler]
    之前,因为它需要首先进行评估

  • 您的原始代码也是如此:
    i=i+Zähler
    。您的超调量为1,因此我必须添加
    -1
    。通过消除上次
    Zähler++
    效果,它确保了
    打印(a[i])
    不会失败

  • println(a[i]+Zähler)
    将打印添加了
    Zähler
    a[i]
    的数值总和(char值本质上是一个整数)。显然这不是您想要的,所以我将其拆分

  • 我还添加了检查
    if(Zähler!=0)
    ,因为您不希望打印零

  • print
    功能在同一行上打印,而不是
    println

  • 下面的代码中有一点我没有纠正:当您访问for循环中的数组时,循环参数最好使用同一数组的长度。因此,您应该使用
    a.length
    ,而不是
    s.length()

  • 另外:尝试使用
    String.charAt()
    重写程序

工作程序在Ideone上

static void codieren(字符串s){
int Zähler=0;
char[]a=s.toUpperCase().toCharArray();

对于(int i=0;i这里有一个使用“回溯”的替代算法,IMHO更易于维护(长度截止不是回溯算法中扫描阶段的一部分)

步骤:

  • 浏览字符
  • 每当有“变化”时,决定如何处理序列 目前可用
  • 继续扫描
  • 这将工作分为两部分…“扫描边缘”和“表示最后一个序列”,可以以模块化方式进行编码

    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"));
    
    }
    
    publicstaticstringgetcollapsed(stringinstring){
    char[]chars=inString.toUpperCase().toCharArray();
    StringBuilder sb=新的StringBuilder(inString.length());
    char curChar='';
    char lastChar='';
    int lastCount=0;
    for(int i=0;i
    用两次怎么样

    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;
      }
    
    i=0;
    计数器=0;
    currentchar=s[0]
    stringbufferoutputstr;
    当我
    请不要在语法中使用umlauts!我们不是德语说话者为什么不使用umlauts?我通常喜欢有意义的标识符,拼写正确。对于您的数据字符串,它肯定会执行循环,但由于ArrayIndexOutOfBoundsException而失败。@PatriciaShanahan-因为源代码通常以ascii或8位编码保存文本编辑器之间没有定义的标准
    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"));
    
    }
    
    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;
      }