Groovy range with a 0.5 step size

蹲街弑〆低调 提交于 2019-12-18 04:03:08

问题


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.


回答1:


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"




回答2:


A little late, but this works too

A one-liner for your above set:

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




回答3:


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.




回答4:


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




回答5:


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



回答6:


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



回答7:


my answer is the following:

(1..4).step(0.5)



回答8:


(1..7).collect{0.5*it} is the best I can think of



来源:https://stackoverflow.com/questions/573155/groovy-range-with-a-0-5-step-size

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!