2011-08-22 100 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; 
    } 
}