Groovy范围使用0.5步长。

12
在Groovy中,最优雅的方法是如何指定一系列整数,并在它们之间以0.5步长增加?例如:1、1.5、2、2.5、3、3.5、4。编辑:澄清一下:作为最终结果,我需要一个范围对象,用于在Grails约束中使用。虽然列表也可以。

根据当前的线程,也许你正在寻找制作一个自定义范围实现的市场? - j pimmel
8个回答

30

我能想到的最好方法是使用"step"命令。

例如:


    1.step(4, 0.5){ print "$it "}

将会输出:"1 1.5 2.0 2.5 3.0 3.5"


5

有点晚了,但这也行

以下是你上述集合的一行代码:

(2..8)*.div(2)


1

好的,接着上面的内容。为了测试一个值val是否在1..n范围内,但是有一半的值:

def range = 2..(n*2).collect { return it/2.0 }
return range.contains( val )

这样做是可行的,但不够美观,但如果您需要多次使用它,则可以构建一次范围并多次使用它。


0

我的答案如下:

(1..4).step(0.5)

1
@DavidMann “groovy.lang.IntRange.step()” 没有可用于参数类型为“java.math.BigDecimal”的方法签名。 - tim_yates

0

作弊。

将您想要的范围映射到另一个更容易由Groovy处理的范围。 您需要类似于以下内容:

 y in [x, x+0.5, x+1, x+1.5, ..., x+n] // tricky if you want a range object

当且仅当以下条件成立时为真:

 2*y in [2x,2x+1,2x+2,2x+3,...,2x+2n] // over whole integers only

这与范围对象相同:

(2*x)..(2*x+2*n).contains(2*y)   //simple!

或者:

switch (2*y) {
   case (2*x)..(2*x+2*n): doSomething(); break;
   ...}

0

(1..7).collect{0.5*it} 是我能想到的最好的方法。


0
def r = []
(0..12).each() {
  r << it
  r << it + 0.5
}

0

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