2009-02-21 6 views
10

¿Cuál es la forma más elegante en Groovy de especificar un rango de enteros y los 0.5 pasos entre ellos? e.g .: 1, 1.5, 2, 2.5, 3, 3.5, 4Rango maravilloso con un tamaño de 0,5 pasos

Editar: Para aclarar: como resultado final necesito un objeto de rango para usar en una restricción de Grails. Aunque supongo que una lista también estaría bien.

+0

a juzgar por el hilo que prevalece, tal vez usted está en el mercado para hacer una [impl rango personalizado] (http://kousenit.wordpress.com/2009/ 02/07/making-a-groovy-class-a-range /)? –

Respuesta

28

La mejor manera que puedo ver es usando el comando step.

es decir


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

habría imprimir: "1 1,5 2,0 2,5 3,0 3,5"

+0

+1 Parece que esta es la mejor respuesta –

2

Soo, para construir sobre anteriormente. Para probar si un valor val está en el rango 1..n pero con valores medio:

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

Algo así como que iba a funcionar, pero no es tan bonito como me gustaría, pero le permite construir la rango una vez y úsela varias veces, si lo necesita.

1

Cheat.

Localice su rango deseado en otro que Groovy maneje más fácilmente. ¿Quieres algo como:

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

lo cual es cierto si y sólo si:

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

que es el mismo que el objeto gama:

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

o:

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

Un poco tarde, pero esto también funciona

Una sola línea de su anterior conjunto:.

(2..8) * div (2)

1

mi respuesta es la siguiente:

(1..4).step(0.5) 
+0

¡No estoy seguro de por qué esto fue votado, funcionó para mí! –

+1

@DavidMann 'Sin firma de método: groovy.lang.IntRange.step() es aplicable para los tipos de argumento: (java.math.BigDecimal) values: [0.5]' –

1

(1..7).collect{0.5*it} es lo mejor que puedo pensar en