Arrays的新手,我对逻辑感到困惑

时间:2015-03-01 02:47:58

标签: java

非常基本的方法来获取数组中的最小值而不使用列表或集合等,只是迭代

在我的主要驱动程序中,我到目前为止通过了三次测试,

  1. {2} - 如果退回将打印PASS:2
  2. {1,3,8} - 如果退回将打印PASS:1
  3. {9,5,8,4} - 如果退回将打印PASS:4
  4. 问题是当它进入测试3时我得到了

    ArrayIndexOutOfBoundsException : 9
    

    我知道这意味着什么,我的阵列得到的数字超出了我的条件但是在筛选之后我就无法确定在哪里。

     public int min(int[] newArray)
        {
            int value = newArray[0];
    
    
            if (newArray.length >= 1)
            {
                for (int i = 1; i < newArray.length; ++i)
                {
                    if (newArray[i] < newArray[value])
                    {
                        value = newArray[i];
                        System.out.println(newArray[i]);
                    }
                    /**else if (newArray[i] > newArray[value])
                    {
                        value = newArray[value];
                    }
                    */
                }
            }
            else if (newArray.length < 2)
            {
                value = newArray[0];
            }
    
            return value;
        }
    

    刚刚更新了我的代码,

    感谢所有帮助仍有问题,请将此全部映射到我的白板上

5 个答案:

答案 0 :(得分:1)

问题接近开始。

if (newArray.length < 1)   //for the first test case, will just return [0] since the length of it is only 1 element, which has to be the min
{
    value = newArray[0];
}

如果长度小于1,则它必须为0,表示它为空。如果数组为空,则尝试提取第一个元素。

你需要问自己:如果数组为空, 中的最小数字是什么?这不是编码或算法问题。这是一个设计问题。

答案 1 :(得分:0)

我不会告诉你问题出在哪里。这是你的工作......你的工作就是学习如何去做。

此技能称为“调试”,&gt;&gt;您&lt;&lt;需要学习如何去做。

但是我会就如何找到这样的问题给你一些建议:

  1. 学习使用Java IDE的调试器。它将包括设置断点,单步执行程序以及检查对象和变量状态的功能。

  2. 使用跟踪图。暂时向代码添加额外的语句以打印出变量的值。

  3. 手执行。 (这真的是“老派” 1 )。获取纸和笔,并记下变量的名称。当假装你是计算机时,通过逐步完成语句并在你的纸上写下/更新变量的值来仔细“执行”程序。

  4. 但是在所有情况下,你都需要学会思考你的所编写的程序,并解释你所看到的证据。


    1 - 别笑。这就是他们教你如何在打孔卡片上编写程序时调试程序......

答案 2 :(得分:0)

如果阵列长度<1。 1它为零,所以在这种情况下,它总是导致一个ArrayIndexOutOfBoundsException:0

此外,您正在保存数组的值,然后使用该值作为索引来测试其他数组值。

保存值的索引(value = i),然后在结尾处返回newArray [value],否则保存值并对值本身进行测试(newArray [i]&lt; value和newArray [i]&gt; ;价值)

另外,为什么使用2 if if statments?

if (newArray.length == 0) return 0 (or whatever makes sense for your program).

int value = Integer.MAX_VALUE

for (int i = 0; i < newArray.length; i++) {
    if (newArray[i] < value) {
        value = newArray[i];
    }
}

return value

答案 3 :(得分:0)

异常消息告诉您索引9超出范围。问问自己:系统从哪里获得数字9?

下面是你的小作业练习的答案,但首先我无法抗拒一点编程语言讲座......

在编程语言理论中,返回返回值的子例程称为 functions ,那些不返回值的子例程称为 procedures 。你正在写一个函数。

有时维护函数中的变量作为返回值是有帮助的,就像使用int value一样。这样做时,最好给该变量赋予与函数相同的名称。有些语言强制执行此操作,但Java没有。所以看看下面的功能,让自己相信它有效。

count变量可防止对array.length进行不必要且昂贵的引用。此外,如果array.length为零,则此函数不会在循环上进行迭代,并且只返回最大可能的int。这可能适用于您的程序,也可能不适用于您的程序,但是当阵列没有元素时会发生什么,这是您必须考虑的问题。但是,如果您假设您的数组可以包含任何可能的int值(如果它不能,那么如果您在array中遇到这些值,您将如何处理它? ),然后Integer.MAX_VALUE是唯一正确的返回值。哦,我忘了检查null array。编辑:

public int min(int[] array) {
   int min = Integer.MAX_VALUE;

   if (array == null) return min;

   const int count = array.length;
   for (int i=0; i<count; i++) {
      min = min < array[i] ? min : array[i];
   }

   return min;
}

答案 4 :(得分:0)

好吧,经过所有建议我将方法改为以下

public int min(int[] newArray)
    {
        int value = newArray[0];


        if (newArray.length >= 1)
        {
            for (int i = 1; i < newArray.length; ++i)
            {
                if (newArray[i] < value)
                {
                    value = newArray[i];
                }
            }
        }
        else if (newArray.length < 2)
        {
            value = newArray[0];
        }

        return value;
    }

这对我所有5个独特的测试用例都完美无缺,但其中没有一个是空数组。我想如果我想测试一下我会做一个else语句说如果它是空的而不是返回Invalid

谢谢大家