Java中类似于PHP的range函数

4

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

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

创建类似于1900, 1904, 1908, ...的数组,在Java中是否有类似的简单方法?


4
请注意,1900年不是闰年。 - hummingBird
3
您对闰年的定义并不十分准确... 能被100整除但不能被400整除的年份不是闰年 ;) - NikiC
谢谢大家记得,尽管我会保持原样,但这不是问题的目的。 - Centurion
3个回答

4
这方面没有内置的功能,但是实现这样一个范围作为不可变的Iterable<Long>(或Integer或其他类型)相对简单。只需创建一个自定义的Iterator,从起始值开始,并在每次调用next()时递增,直到超过结束值。您还需要决定如何以及是否处理高到低的迭代等问题,但这并不难。您也可以将其作为List的不可修改实现来执行,其中每个索引的值都是按需计算的(start + index * increment)。
虽然您的问题涉及基于范围创建“数组”,但通常不需要整个范围的数据填充的数组,特别是如果您只想遍历范围内的数字。如果只需要这样,您最终会遍历范围内的数字两次以创建数组或List,然后读取它。使用我描述的惰性范围迭代器就没有这个缺点。此外,如果确实需要将所有值直接存储在内存中,则可以轻松地将惰性迭代器复制到List中。与构建数组相比,它唯一的劣势是一些自动装箱开销。

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

我猜这不适用于反向范围,如range(2000, 1000, 100) - whiskeysierra

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
ArrayList<int> 应该改为 ArrayList<Integer> - gen_Eric
好观点,谢谢。我在工作中没有Java来测试它。 :( - Richard Marskell - Drackir
@Drackir:哦。你在工作啊:你必须工作;-) 或者是否无论你是否工作都无所谓?;-) - Martijn Courteaux
@Drackir:我不太确定,但是我认为你不能使用ArrayList<Integer>.toArray()(返回的是Object[])强制转换为int[]或者直接作为int[]来使用。 - Martijn Courteaux

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接