12

在 Groovy 中指定整数范围和它们之间的 0.5 步的最优雅的方式是什么?例如:1、1.5、2、2.5、3、3.5、4

编辑:澄清:作为最终结果,我需要一个用于 Grails 约束的范围对象。虽然我想一个列表也可以。

4

8 回答 8

30

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

IE


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

将打印出:“1 1.5 2.0 2.5 3.0 3.5”

于 2009-02-21T15:05:47.093 回答
5

有点晚了,但这也有效

上述套装的单衬:

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

于 2009-09-08T22:41:36.327 回答
1

苏,以上述为基础。要测试值 val 是否在 1..n 范围内但具有一半值:

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

类似的东西会起作用,但不像我想要的那样漂亮,但它可以让你构建一次范围并多次使用它,如果你需要的话。

于 2009-02-21T17:08:44.193 回答
0
def r = []
(0..12).each() {
  r << it
  r << it + 0.5
}
于 2009-05-29T16:32:28.033 回答
0

仅供参考,从 Groovy 1.6.0 开始,它似乎不原生支持。目前只存在 ObjectRange.step(int) 。

http://groovy.codehaus.org/api/groovy/lang/ObjectRange.html#step%28int%29

于 2009-02-21T15:14:09.600 回答
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;
   ...}
于 2009-03-14T17:28:44.873 回答
0

我的回答如下:

(1..4).step(0.5)
于 2012-04-26T12:07:03.320 回答
0

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

于 2014-11-14T22:38:20.837 回答