2010-10-26 77 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