2011-08-22 58 views
2

我试图创建一个方法来检查增加元素的数组。如果所有元素的顺序都是递增的,则应该返回True。当我比较arr [i + 1]时,我会遇到越界异常。任何关于如何让它工作的想法。(Java)检查增加元素的数组

int[] one = {1,2,3,4,5}; 

public static boolean isIncreasing(int[]arr) 
{ 
    boolean z = false; 

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

     if(arr[i]<arr[i+1]) 
      { 
       z = true; 
      } 
    } 

    return z; 
} 

回答

2

我建议你写这样

public static boolean isIncreasing(int[]arr) 
{ 
    for(int i=1; i<arr.length;i++) 
    { 
     if(arr[i-1]>arr[i]) 
      return false; 
    } 
    return true; 
} 

你的方法将有助于

  • 返回正确的结果(你返回true时,它不应该)
  • 考虑出界
  • 避免不必要的循环
+1

我会建议'isNonDecreasing'会是一个更好的名字。 –

4

因为与n项的列表,只有n-1它们之间的差距。

更改为

for (int i=0; i<arr.length-1; i++) 

(你也可能要检查是否有false开始时设置为true是围绕正确的方式)。

+0

我试过这样做。数组中的最后一个元素没有得到比较。如果我将最后一个元素更改为减少,我仍然会得到“真实”。 – jlss4e

+0

@ jlss4e看看波希米亚的答案;他解释说它很好。 – Owen

1

当(i + 1)的值变为array.length时,您会得到该异常。例如,如果您有一个长度为10的数组,则元素索引将从0,1,2 ...到9,因此要么检查直到i < arr.length - 1,要么可以相应地修改您的逻辑。

4

你有两个问题:

  1. 你的循环是一个迭代过长:由于您检验部件i+1,我需要完成增加一个迭代早于通常的循环。
  2. 你的逻辑是有缺陷的。你的循环将终止首次支票是真的,那么这个数组将传递:{1, 2, 0}测试时,在第一次迭代测试1 < 2这是真的,所以返回true - 这不是我们想要的)

定影这两个问题:

int[] one = {1,2,3,4,5}; 

public static boolean isIncreasing(int[] arr) { 
    for(int i=0 ; i < arr.length - 1; i++) { // finish at length - 1 
     if (arr[i] > arr[i+1]) { 
      return false; // found elements that are out of order - return false 
     } 
    }  
    return true; // nothing out of order found - return true 
} 

这样的逻辑 - 与早期出口以虚假的问题,真正的最后的回报 - 是非常普遍和良好的模式学习。

+0

我明白了。感谢您的解释。 – jlss4e

1

您可以使用Java 8的IntStream。

import java.util.stream.IntStream; 

public class Test { 
    public static boolean isIncreasing(int[] a) { 
    return IntStream.range(1, a.length).reduce(0, (acc, e) -> acc + (a[e - 1] <= a[e] ? 0 : 1)) == 0; 
    } 
}