繁体   English   中英

PHP的Java函数

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM