PHP的范围函数在php中的工作方式如下:
$leap_years = range(1900, 2000, 4);
创建类似1900, 1904, 1908, ...
的数组
在Java中有这样简单的东西吗?
答案 0 :(得分:4)
没有为此内置任何内容,但实现诸如不可变Iterable<Long>
(或Integer
或其他)之类的范围相对简单。只需创建一个从起始值开始的自定义Iterator
,然后为每次调用next()
递增,直到您传递结束值。您必须决定如何以及是否要处理从高到低的迭代等等,但这并不难。您也可以将此作为List
的不可修改的实现,其中每个索引的值都是按需计算的(start + index * increment
)。
虽然您的问题是基于范围创建“数组”,但通常不需要在整个范围内填充数据的数组,特别是如果您只想迭代范围中的数字。如果这就是你想要的,那么你最终将遍历两次范围内的数字来创建一个数组或List
,然后阅读它。正如我所描述的那样使用惰性范围迭代器没有这个缺点。此外,如果您希望直接将所有值存储在内存中,则可以轻松地将惰性迭代器复制到List
中。与构建数组相比,它的唯一缺点是一些自动装箱开销。
答案 1 :(得分: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;
}
答案 2 :(得分: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;
}
}