簡體   English   中英

數組索引越界Java程序

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM