[英]PHP's range function in Java
PHP的范围函数在php中的工作原理如下:
$leap_years = range(1900, 2000, 4);
创建像1900, 1904, 1908, ...
这样的数组1900, 1904, 1908, ...
在Java中有这么简单吗?
没有为此内置任何内容,但实现诸如不可变的Iterable<Long>
(或Integer
或其他)之类的范围相对简单。 只需创建一个从起始值开始的自定义Iterator
,然后为每次调用next()
递增,直到传递结束值。 您必须决定如何以及是否要处理从高到低的迭代等等,但这并不难。 您也可以将此作为List
的不可修改的实现,其中每个索引的值是按需计算的( start + index * increment
)。
虽然您的问题是基于范围创建“数组”,但通常不需要在整个范围内填充数据的数组,特别是如果您只想迭代范围中的数字。 如果这就是你想要的全部,你最终将遍历范围内的数字两次以创建一个数组或List
然后读取它。 正如我所描述的那样使用惰性范围迭代器没有这个缺点。 此外,如果您希望直接将所有值存储在内存中,则可以轻松地将惰性迭代器复制到List
中。 与构建阵列相比,它的唯一缺点是一些自动装箱开销。
你应该这样做:
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;
}
你可以像这样模拟它:
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;
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.