有人可以向我解释为什么我的数据超出界限错误吗?
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;
}
}
答案 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