views:

1005

answers:

7

What's the most elgant way in Groovy to specify a range of integers and the 0.5 steps between them? e.g.: 1, 1.5, 2, 2.5, 3, 3.5, 4

Edit: To clarify: As an end result I need a range object for use in a Grails constraint. Though I suppose a list would be OK too.

+4  A: 

Best way I can see is using the step command.

i.e.


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

would print out: "1 1.5 2.0 2.5 3.0 3.5"

kgrad
+1  A: 

FYI, as of Groovy 1.6.0, it seems not to support natively. There exists only ObjectRange.step(int) at the moment.

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

chanwit
+2  A: 

Soo, to build on above. To test if a value val is in the range 1..n but with half values:

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

Something like that would work, but isn't as pretty as I'd like, but it lets you build the range once and use it multiple times, if you need that.

Bill James
+2  A: 

Judging by the prevailing thread, perhaps you are in the market for making a custom Range impl?

j pimmel
I was hoping that there would be a out-of-the-box solution, but it looks like this is the only option.
Michael Borgwardt
+1  A: 

Cheat.

Map your desired range into another that is more easily handled by Groovy. You want something like:

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

which is true if and only if:

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

which is the same as the range object:

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

or:

switch (2*y) {
   case (2*x)..(2*x+2*n): doSomething(); break;
   ...}
Allen
+1  A: 
def r = []
(0..12).each() {
  r << it
  r << it + 0.5
}
Lurch
+1  A: 

A little late, but this works too

A one-liner for your above set:

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

Milan Ramaiya