PHP的Java函数

时间:2010-10-26 18:03:51

标签: java php function range

PHP的范围函数在php中的工作方式如下:

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

创建类似1900, 1904, 1908, ...的数组 在Java中有这样简单的东西吗?

3 个答案:

答案 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;
 }
}