2009-02-21 9 views
10

Jaki jest najbardziej elegancki sposób w Groovy, aby określić zakres liczb całkowitych i 0,5 kroków między nimi? np .: 1, 1,5, 2, 2,5, 3, 3,5, 4Zakres Groovy z rozmiarem 0.5 stopnia

Edycja: celu wyjaśnienia: Jako wynik końcowy trzeba obiekt zakresu do użycia w ograniczeniu Grails. Chociaż przypuszczam, że lista też byłaby OK.

+0

Sądząc wątku panującej, może jesteś w rynku wytwarzania [niestandardowy zakres Impl] (http://kousenit.wordpress.com/2009/ 02/07/making-a-groovy-class-a-range /)? –

Odpowiedz

28

Najlepszym sposobem, jaki widzę, jest użycie polecenia krok.

tj


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

by drukować "1 1,5 2,0 2,5 3,0 3,5"

+0

+1 Wygląda na to, że jest to najlepsza odpowiedź. –

2

Soo, aby zbudować na powyżej. Aby sprawdzić, czy wartość val jest w zasięgu 1..n ale z połową wartości:

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

Coś takiego będzie działać, ale nie jest tak ładna jak chciałbym, ale pozwala budować zasięgaj raz i używaj go wiele razy, jeśli tego potrzebujesz.

1

Cheat.

Zamapuj żądany zakres na inny, który jest łatwiej obsługiwany przez Groovy. Chcesz coś takiego:

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

co jest prawdziwe wtedy i tylko wtedy, gdy:

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

który jest taki sam jak przedmiot zakres:

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

czyli

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

Trochę późno, ale to działa zbyt

one-liner do powyższego zestawu.

(2..8) * div (2)

1

moja odpowiedź jest następująca:

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

Nie wiem, dlaczego ten głos został odrzucony, pracował dla mnie! –

+1

@DavidMann 'Brak sygnatury metody: groovy.lang.IntRange.step() ma zastosowanie do typów argumentów: (java.math.BigDecimal) wartości: [0.5]' –

Powiązane problemy