[英]Array Index out of bounds Java program
有人可以向我解釋為什么我得到一個數組越界錯誤嗎?
longestStreak : 布爾數組 -> 整數
目的:計算輸入參數值中連續出現的最長連續真值的長度
輸入:values 是長度至少為 1 的布爾值的非空數組
output : 輸出在輸入數組中找到的最大連續真數
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;
}
}
我猜是以下內容:
當values[i]
為true
,行: i = output [z];
將嘗試達到可能大於2
的索引。
我認為有問題的代碼行是
i = output[z];
原因是因為我認為您可以將 i 設置為大於 values.length 的值,所以我重新閱讀了您的問題陳述。 下面的代碼將為您修復它並且它有效。 只需將其插入:導入 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;
}
}
應該使用這樣的東西,而不是:
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;
}
出現此問題是因為values.length
大於arrsize
。 考慮以下場景。
在您的輸入中,有 3 個true
值和 2 個false
值。 您的代碼表示,如果values[i]
為 true,則arraysize
將增加。 所以這里arraysize
是 3,但values.length
是布爾數組的大小,其中包含 true 和 false 也是 5。你的內循環運行到values.length
即 5,你的output
數組的大小是 3。這就是為什么ArrayIndexOutOfBoundsException
異常發生了。
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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.