2010-10-26 120 views
4

PHP的功能範圍內像這樣在PHP工作:PHP的範圍功能

$leap_years = range(1900, 2000, 4); 

創建像1900, 1904, 1908, ... 數組有沒有一些簡單的像這樣在Java中?

+4

知道,1900不是閏年。 – hummingBird 2010-10-26 18:06:49

+3

@OP:你對閏年的定義並不十分精確......被100整除而不能被400整除的年份並不是閏年;) – NikiC 2010-10-26 18:16:23

+0

感謝球員們的記憶,即使我會像現在這樣離開,這不是問題的目的。 – Centurion 2010-10-26 21:34:41

回答

4

這裏沒有內置任何東西,但實現這樣一個範圍是相對簡單的,如不可變的Iterable<Long>(或Integer或其他)。只需創建一個自定義Iterator,該值從起始值開始,然後爲每個呼叫增加next(),直到您傳遞最終值。你必須決定如何以及如果你想處理從高到低的迭代等等,但這並不難。您也可以將其作爲List的不可修改實現,其中每個索引的值按需計算(start + index * increment)。

雖然您的問題是基於範圍創建「數組」,但是通常不需要包含整個範圍內數據的數組,特別是如果您只是想遍歷範圍內的數字。如果這就是你想要的,你將最終遍歷範圍內的兩個數字來創建一個數組或List然後讀取它。正如我所描述的,使用惰性範圍迭代器沒有這個缺點。此外,如果您確實希望直接存儲在內存中的所有值,則可以輕鬆地將惰性迭代器複製到List中。與構建數組相比,它的唯一缺點是一些自動裝箱開銷。

1

你可以模擬這樣的:

public int[] range(int startVal, int endVal, int increment) { 
    if (startVal >= endVal) { 
    //handle error or add option to go backwards 
    } 
    int count = ((endval - startval)/increment) + 1; 
    int[] myArr = new int[count]; 
    for (int i=0; i <= count; i++) { 
    myArr[i] = startVal + (i * increment); 
    } 
    return myArr; 
} 
}
+3

您不能使用泛型的基元。 – ColinD 2010-10-26 18:25:25

+0

ArrayList的''應該是ArrayList的''好 – 2010-10-26 18:45:31

+0

點,謝謝。我在這裏沒有Java來測試它。 :( – 2010-10-26 18:51:06

3

你應該做的是這樣的:

public int[] range(int start, int end, int increment) { 
    if (start < end && increment < 0) throw new IllegalArgumentException(); 
    if (start > end && increment > 0) throw new IllegalArgumentException(); 

    int[] values = new int[Math.abs((end - start)/increment) + 1]; 
    boolean reverse = start > end; 

    for (int i = start, index = 0; reverse ? (i >= end) : (i <= end); i+=increment, ++index) 
    { 
     values[index] = i; 
    } 
    return values; 
} 
+0

我想這不適用於反轉範圍,如'範圍(2000,1000,100);'。 – whiskeysierra 2010-10-26 18:34:04

+0

@Willi:的確,我編輯了我的方法,但沒有經過測試...... – 2010-10-26 18:39:01