Java 索引X超出长度Y的界限

Java 索引X超出长度Y的界限,java,Java,出于某种原因,此代码抛出异常“索引20超出长度20的界限”。我尝试使用不同的System.out.println来跟踪代码,并尝试进行调试,我发现一旦进入最后一个周期,代码就超出了范围。我对java相当陌生。我正在努力理解这门语言,但我不明白我做错了什么 这个问题的关键是使用这个数组序列返回一个字符串,用子序列的第一个和最后一个替换连续的数字(例如,在下面的示例中,7,8,9,10,11将是7-11) 我用于调试的阵列如下所示: int[] {-6, -3, -2, -1, 0, 1, 3,

出于某种原因,此代码抛出异常“
索引20超出长度20的界限”
。我尝试使用不同的System.out.println来跟踪代码,并尝试进行调试,我发现一旦进入最后一个周期,代码就超出了范围。我对java相当陌生。我正在努力理解这门语言,但我不明白我做错了什么

这个问题的关键是使用这个数组序列返回一个字符串,用子序列的第一个和最后一个替换连续的数字(例如,在下面的示例中,7,8,9,10,11将是7-11)

我用于调试的阵列如下所示:

 int[] {-6, -3, -2, -1, 0, 1, 3, 4, 5, 7, 8, 9, 10, 11, 14, 15, 17, 18, 19, 20}.
它应该返回字符串=
“-6,-3-1,3-5,7-11,14,15,17-20”

在这行代码之前,我已经尝试过打印,
I=16
,这意味着一旦它完成这个迭代,
j=3
I
最终将是19,并完成这个循环。(因为第27行“
i+=j;
”应该将
i
设置为19)

希望我尽可能清楚地解释了这个问题,以下是我迄今为止编写的代码

class Solution {
        public static String rangeExtraction(int[] arr) {
      
      String res="";
      //int start=0;
      int end=0;
      int j=0;
     
      
      for(int i=0;i<arr.length;i++){
        
        System.out.println("i="+i);
        
        if(arr[i]+1==arr[i+1]){
          
          while(arr[i+j]+1==arr[i+j+1]){
              end=arr[i+j+1];
              j++;
              
             System.out.println("j="+j);
            }
          
          if(j!=1){ res+=arr[i]+"-"+end+","; }
          else{res+=arr[i]+","+end+",";}
          
          
          i+=j;
          j=0;
          
          }else{
          res+=arr[i]+",";
        }                
      }                
    return res.substring(0,res.length()-1);
  }
}

类解决方案{
公共静态字符串范围提取(int[]arr){
字符串res=“”;
//int start=0;
int end=0;
int j=0;

对于(int i=0;i您的指针指向您初始化为int arr的数组长度之外的索引。
当您像i+1一样向前移动一个索引时,您需要运行循环n-1次或长度-1次
if条件中也有i+j,您可以使用
mod“%”运算符
,该运算符将索引钳制在数组长度内。 当我在main函数中运行这个程序时,可以取消对return语句的注释

 int arr[] = {-6, -3, -2, -1, 0, 1, 3, 4, 5, 7, 8, 9, 10, 11, 14, 15, 17, 18, 19, 20};

  String res="";
  //int start=0;
  int end=0;
  int j=0;
 
  
  for(int i=0;i<arr.length - 1;i++){
    
    System.out.println("i="+i);
    
    if(arr[i]+1==arr[i+1]){
      
      while(arr[(i+j) % arr.length]+1==arr[(i+j+1) % arr.length]){
          end=arr[i+j+1];
          j++;
          
         System.out.println("j="+j);
        }
      
      if(j!=1){ res+=arr[i]+"-"+end+","; }
      else{res+=arr[i]+","+end+",";}
      
      
      i+=j;
      j=0;
      
      }else{
      res+=arr[i]+",";
    }
    
    
  }
    
    //return res.substring(0,res.length()-1);
}
intarr[]={-6,-3,-2,-1,0,1,3,4,5,7,8,9,10,11,14,15,17,18,19,20};
字符串res=“”;
//int start=0;
int end=0;
int j=0;

对于(int i=0;我可以回答你的问题吗?@Turing85我也发现了这个线程,但我发现它可能不是这样,或者至少我觉得不是这样,因为通过遵循代码,我在上一个循环中计算出i=19,所以在它应该退出并返回res之后立即检查for条件。我在这里和那里做了一系列打印因为我刚刚写了索引,所以在最后一次检查之前我不应该超过19。我不知道我是否清楚,希望你能帮助我更好地理解我的问题!
I=19
,然后你将
arr[I]+1
arr[I+1]进行比较
。当
i=19
时,你认为
i+1
是什么?请阅读:哦,好吧,我知道错误在哪里了。我想它只会返回false,因为该数组中的index=20肯定不等于index 19。我真诚地认为这只是for语句的一个例外。好吧,所以我不应该比较越界值,注意到.我真的被一个事实震惊了,那就是我这么久都没有想到这个%的方法。它是如此合乎逻辑,但很难找到(至少对我来说),谢谢你真的帮助了我!啊,不用担心,继续增长(y)。
 int arr[] = {-6, -3, -2, -1, 0, 1, 3, 4, 5, 7, 8, 9, 10, 11, 14, 15, 17, 18, 19, 20};

  String res="";
  //int start=0;
  int end=0;
  int j=0;
 
  
  for(int i=0;i<arr.length - 1;i++){
    
    System.out.println("i="+i);
    
    if(arr[i]+1==arr[i+1]){
      
      while(arr[(i+j) % arr.length]+1==arr[(i+j+1) % arr.length]){
          end=arr[i+j+1];
          j++;
          
         System.out.println("j="+j);
        }
      
      if(j!=1){ res+=arr[i]+"-"+end+","; }
      else{res+=arr[i]+","+end+",";}
      
      
      i+=j;
      j=0;
      
      }else{
      res+=arr[i]+",";
    }
    
    
  }
    
    //return res.substring(0,res.length()-1);
}