数组索引超出Java程序范围

时间:2017-10-02 04:27:01

标签: java arrays indexoutofboundsexception

有人可以向我解释为什么我的数据超出界限错误吗?

longestStreak:布尔数组 - >整数
 目的:计算输入参数值中连续真实出现的最长条纹的长度  输入:值是一个非空的布尔数组,长度至少为1

输出:输出在输入数组中找到的最大连续trues数

import java.util.Arrays;

public class Problem3 {

  public static void main (String[] args) { 
    boolean[] test = new boolean[] {true, false, true, true, false};
    int[] o = longestStreak(test);
    System.out.println(o);
  }

  public static int[] longestStreak(boolean[] values) {
    int streak = 0; 
    int max = 0;
    int arrsize = 0; 
    for (int i = 0; i < values.length; i++) {
      if (values[i]) {   
        streak++;
        max = streak;
        arrsize++;
      }
      else {           
        streak = 0;
      }
    }

    int[] output = new int[arrsize];

    for (int i = 0; i < values.length; i++) { 
      for (int z = 1; z < values.length; z++) {
        if (values[i]) {
          i = output[z];
        }
      }
    }
    return output;
  }

}

5 个答案:

答案 0 :(得分:1)

我猜它是以下的:

values[i]true行时,i = output [z];会尝试访问可能大于2的索引。

答案 1 :(得分:0)

我认为有问题的代码行是

i = output[z];

原因是因为我认为你可以设置i等于大于values.length的值 好的,所以我重读了你的问题陈述。下面的代码将为您修复它,它的工作原理。插上电源:             import java.util.Arrays;

  public class Test {


  public static void main (String []args) { 


 boolean[] test = new boolean[] {true, false, true, true, false};

 int[] o = longestStreak(test);
 System.out.println ("{"+o[0] + ", " + o[1]+"}");
  }



    public static int[] longestStreak(boolean[] values) {


 int  streak = 0; 
 int max =0;
 int arrsize =0;
 int maxStart = 0;
 int[] r = new int[2];


 for (int i=0; i<values.length; i++) {
   if (values[i]) {   
     streak++;
//     max =streak;
//     arrsize++;
     }

else {
    if (streak > max) {
        max = streak;
        maxStart = 0;
        maxStart = i - streak;
    }
    streak = 0;
   }
 }
 r[0] = max;
 r[1] = maxStart;
 return r;
  }


  }

答案 2 :(得分:0)

应该使用这样的东西,而不是:

public static int longestStreak(boolean... values)
{
   int streak = 0; 
   int max =0;
   for (int i = 0; i < values.length; ++i)
   {
      if (values[i])
         streak++;
      else
      {
         if (streak > max)
            max = streak;
         streak = 0;
      }
   }
   return max;
}

答案 3 :(得分:0)

发生此问题是因为values.length大于arrsize。请考虑以下情况 在您的输入中,有3个true值和2个false值。您的代码表示如果arraysize为真,values[i]将会递增。所以这里arraysize是3,但是values.length是布尔数组的大小,其中包含true和false也是5.你的内部循环运行到values.length即5和你的{{ 1}}数组的大小为3.这就是发生output异常的原因。

答案 4 :(得分:0)

for (int i = 0; i < values.length; i++) { 
  for (int z = 1; z < values.length; z++) {
    if (values[i]) {
      i = output[z];
    }
  }
}

此处输出数组大小将小于数组大小。因此它会抛出 ArrayIndexOutOfBoundsExecption

这是一个使用ArrayList的修改代码。

public static void main(String[] args) {

    boolean[] test = new boolean[] { true, false, true, true, false };

    ArrayList<Integer> o = longestStreak(test);
    for(int x : o) System.out.println(x);
}

public static ArrayList<Integer> longestStreak(boolean[] values) {
    ArrayList<Integer> maxStreak = new ArrayList<Integer>();
    int currentStreak = 0;

    for (int x = 0; x < values.length; x++)
        if(values[x]) {
            if (++currentStreak == 1)maxStreak.clear();
            if (currentStreak >= maxStreak.size()) maxStreak.add(x);

        } else currentStreak = 0;

    return maxStreak;

}

这是输出(布尔数组中最大条纹的位置)

2
3