PHP的功能范围内像这样在PHP工作:PHP的范围功能
$leap_years = range(1900, 2000, 4);
创建像1900, 1904, 1908, ...
数组有没有一些简单的像这样在Java中?
PHP的功能范围内像这样在PHP工作:PHP的范围功能
$leap_years = range(1900, 2000, 4);
创建像1900, 1904, 1908, ...
数组有没有一些简单的像这样在Java中?
这里没有内置任何东西,但实现这样一个范围是相对简单的,如不可变的Iterable<Long>
(或Integer
或其他)。只需创建一个自定义Iterator
,该值从起始值开始,然后为每个呼叫增加next()
,直到您传递最终值。你必须决定如何以及如果你想处理从高到低的迭代等等,但这并不难。您也可以将其作为List
的不可修改实现,其中每个索引的值按需计算(start + index * increment
)。
虽然您的问题是基于范围创建“数组”,但是通常不需要包含整个范围内数据的数组,特别是如果您只是想遍历范围内的数字。如果这就是你想要的,你将最终遍历范围内的两个数字来创建一个数组或List
然后读取它。正如我所描述的,使用惰性范围迭代器没有这个缺点。此外,如果您确实希望直接存储在内存中的所有值,则可以轻松地将惰性迭代器复制到List
中。与构建数组相比,它的唯一缺点是一些自动装箱开销。
你可以模拟这样的:
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;
}
}
您不能使用泛型的基元。 – ColinD 2010-10-26 18:25:25
ArrayList的''
点,谢谢。我在这里没有Java来测试它。 :( – 2010-10-26 18:51:06
你应该做的是这样的:
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;
}
我想这不适用于反转范围,如'范围(2000,1000,100);'。 – whiskeysierra 2010-10-26 18:34:04
@Willi:的确,我编辑了我的方法,但没有经过测试...... – 2010-10-26 18:39:01
知道,1900不是闰年。 – hummingBird 2010-10-26 18:06:49
@OP:你对闰年的定义并不十分精确......被100整除而不能被400整除的年份并不是闰年;) – NikiC 2010-10-26 18:16:23
感谢球员们的记忆,即使我会像现在这样离开,这不是问题的目的。 – Centurion 2010-10-26 21:34:41