【问题标题】:Array Index out of bounds Java program数组索引越界Java程序
【发布时间】:2017-10-02 04:27:00
【问题描述】:

有人可以向我解释为什么我的数组越界错误吗?

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

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

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;
  }

}

【问题讨论】:

  • 你能在哪一行发布你得到异常的信息吗?
  • 根据您的描述,longestStreak 应该返回 int,而不是 int []。从改变它开始。如果您仍有问题,请更新您的问题。
  • @SOlsson 我要查找的最终输出是 [2,2] 的数组。

标签: java arrays indexoutofboundsexception


【解决方案1】:

我猜是这样的:

values[i]true 时,行:i = output [z]; 将尝试到达可能大于2 的索引。

【讨论】:

    【解决方案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;
      }
    
    
      }
    

    【讨论】:

    • 我要寻找的最终输出是 [2,2] 的数组。该代码试图将 I 的位置编号设置为输出 [z] 处设置的值。
    • 需要更多说明,为什么是 [2,2]?前 2 次是连续的次数吗?第二个 2 是多少?
    • 第一个元素是初始数组中最大的true序列。之后的元素是最大序列开始的位置,所以在这个数组中它是位置 2。所以最终输出是 [2,2]。如果数组是 [true, false, true, false, true]。那么输出将是 [1,0,2,4]。
    • 我已经让代码做到了。你能检查一下然后给我正确的答案吗?
    • 是的。非常感谢您的帮助!
    【解决方案3】:

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

    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;
    }
    

    【讨论】:

      【解决方案4】:

      出现此问题是因为values.length 大于arrsize。考虑以下场景。
      在您的输入中,有 3 个 true 值和 2 个 false 值。您的代码说如果values[i] 为真,arraysize 将递增。所以这里 arraysize 是 3,但 values.length 是布尔数组的大小,它包含 true 和 false 也是 5。你的内部循环运行到 values.length 即 5 并且你的 output 数组的大小是 3。这就是发生ArrayIndexOutOfBoundsException 异常的原因。

      【讨论】:

      • 我该如何解决这个问题?它之所以基于 values.length 循环,是因为它基于 values 数组检查真值。
      • 试试这个:for (int z = 1; z &lt; arraysize; z++) {(如果你的问题解决了就忽略)
      【解决方案5】:
      for (int i = 0; i < values.length; i++) { 
        for (int z = 1; z < values.length; z++) {
          if (values[i]) {
            i = output[z];
          }
        }
      }
      

      这里 output 数组大小将小于 values 数组大小。因此它会抛出 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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-01-15
        • 2015-10-26
        • 2016-01-04
        相关资源
        最近更新 更多