【问题标题】:for loop - checking if numbers in array move more up or downfor 循环 - 检查数组中的数字是向上还是向下移动
【发布时间】:2015-06-16 13:38:28
【问题描述】:

我正在使用 for 循环来检查我作为参数输入的数组在整数方面是否有更多的起伏。我不知道为什么,但我的编译器抛出了一个索引越界异常。如果有人能指出来就好了。

public boolean moreUpsThanDowns(int[] a)
{
    int counterup = 0;
    int counterdown = 0;
    for(int i=0 ; i <= a.length ; i++){
        if (a[(i+1)] - a[i] > 0 ){
            counterup++;
        } else if(a[(i+1)] - a[i] < 0 ){
            counterdown++;
        } else if(a[(i+1)] - a[i] == 0 ){
            counterup = counterup;
            counterdown = counterdown;
        }
    }

    if (counterup > counterdown){
        return true;
    } else {
        return false;
    }
}

【问题讨论】:

  • waay 超出范围。你让i 运行到a.length 尽管最后一个有效索引是a.length-1 并且你正在使用a[i+1] 进行索引,所以你至少少了两个。
  • 将“int i=0 ; i
  • 你应该用 for(int i=0 ; i

标签: java arrays loops


【解决方案1】:

一个小的语义修正——编译器不会抛出任何异常——你的代码编译得很好。此代码的运行时执行会导致异常。

更重要的是,数组a 包含从0a.length - 1 的元素。您的代码尝试访问元素编号 a.lengtha.length + 1,这都会导致此异常。由于您在代码中引用了a[i + 1],因此您的循环应该以a.length - 2 结束,或者,用更简洁的术语来说,条件应该是:i &lt; a.length - 1。所以,总结一下:

for (int i = 0 ; i < a.length ; i++) {

【讨论】:

    【解决方案2】:

    由于这一行,您会遇到越界异常:

    for(int i=0 ; i <= a.length ; i++){
    

    应该是:

    for(int i=0 ; i < a.length ; i++){
    

    这是因为 c# 中的数组是 0 索引的。

    例如,如果一个数组有 10 个元素,并且您像 a[10] 一样访问它,您会得到一个越界异常,因为最后一个元素是 a[9]。

    【讨论】:

      【解决方案3】:

      array 从索引 0 开始,所以如果数组包含 3 个元素。最后一个元素是 a[2] 所以

      for(int i=0 ; i <= a.length ; i++) must be for(int i=0 ; i < a.length ; i++) 
      

      并且必须检查是否 i+1

      if(i+1 < a.length)
      

      【讨论】:

        【解决方案4】:

        对于从零开始的索引,范围是[0,a.length)。不仅循环越界,+1 甚至更远。试试吧,

        for (int i = 1; i < a.length; i++)
            if (a[i] - a[i-1] > 0)
                counterup++;
        

        挑剔,你只需要一个柜台。向上递增,向下递减。如果最终计数大于零,则返回 true。您也可以省略最终条件 (==)。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-09-02
          • 2014-07-11
          • 1970-01-01
          • 2015-02-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多