2009-02-21 8 views
10

Quel est le moyen le plus elgant dans Groovy pour spécifier une gamme d'entiers et les 0,5 étapes entre eux? Par exemple: 1, 1.5, 2, 2.5, 3, 3.5, 4Groovy gamme avec une taille de 0,5 étape

Modifier: Pour clarifier: En tant que résultat final, j'ai besoin d'un objet plage à utiliser dans une contrainte Grails. Bien que je suppose qu'une liste serait OK aussi.

+0

a en juger par le fil dominant, peut-être vous êtes sur le marché pour faire une [gamme personnalisée impl] (http://kousenit.wordpress.com/2009/ 02/07/making-a-groovy-class-a-range /)? –

Répondre

28

La meilleure façon de voir est d'utiliser la commande step.

à-dire


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

pourrait imprimer: "1 1,5 2,0 2,5 3,0 3,5"

+0

+1 Il semble que c'est la meilleure réponse –

2

Soo, pour construire sur ci-dessus. Pour tester si une valeur est dans le val 1..n de gamme mais avec des valeurs de demi:

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

Quelque chose comme ça fonctionnerait, mais pas aussi jolie que je voudrais, mais il vous permet de construire la rangez une fois et utilisez-le plusieurs fois, si vous en avez besoin.

1

Triche.

Mappez votre plage désirée dans une autre qui sera plus facilement gérée par Groovy. Vous voulez quelque chose comme:

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

ce qui est vrai si et seulement si:

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

qui est le même que l'objet de gamme:

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

ou:

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 peu plus tard, mais cela fonctionne aussi

Un one-liner pour votre ci-dessus ensemble.

(2..8) * div (2)

1

ma réponse est la suivante:

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

Je ne sais pas pourquoi cela a été voté, a travaillé pour moi! –

+1

@DavidMann 'Aucune signature de la méthode: groovy.lang.IntRange.step() est applicable pour les types d'argument: (java.math.BigDecimal) valeurs: [0.5]' –

1

(1..7).collect{0.5*it} est le meilleur que je peux penser à