Ответ 1
Лучший способ, который я вижу, - использовать команду шага.
то есть.
1.step(4, 0.5){ print "$it "}
будет распечатываться: "1 1.5 2.0 2.5 3.0 3.5"
Какой самый elgant способ в Groovy указать диапазон целых чисел и 0,5 шага между ними? например, 1, 1,5, 2, 2,5, 3, 3,5, 4
Изменить: Чтобы уточнить: в качестве конечного результата мне нужен объект диапазона для использования в ограничении Grails. Хотя я полагаю, что список тоже будет в порядке.
Лучший способ, который я вижу, - использовать команду шага.
то есть.
1.step(4, 0.5){ print "$it "}
будет распечатываться: "1 1.5 2.0 2.5 3.0 3.5"
Немного поздно, но это тоже работает.
Один вкладыш для вашего вышеперечисленного набора:
(2..8) *. ДИВ (2)
Су, чтобы построить сверху. Чтобы проверить, находится ли значение val в диапазоне 1..n, но с половинными значениями:
def range = 2..(n*2).collect { return it/2.0 }
return range.contains( val )
Что-то вроде этого будет работать, но не так красиво, как хотелось бы, но оно позволяет вам создавать диапазон один раз и использовать его несколько раз, если вам это нужно.
FYI, с Groovy 1.6.0, кажется, не поддерживает изначально. В настоящий момент существует только ObjectRange.step(int).
http://groovy.codehaus.org/api/groovy/lang/ObjectRange.html#step%28int%29
Чит.
Сопоставьте свой желаемый диапазон с другим, с которым легче справиться Groovy. Вы хотите что-то вроде:
y in [x, x+0.5, x+1, x+1.5, ..., x+n] // tricky if you want a range object
которое истинно тогда и только тогда, когда:
2*y in [2x,2x+1,2x+2,2x+3,...,2x+2n] // over whole integers only
который совпадает с объектом диапазона:
(2*x)..(2*x+2*n).contains(2*y) //simple!
или
switch (2*y) {
case (2*x)..(2*x+2*n): doSomething(); break;
...}
def r = []
(0..12).each() {
r << it
r << it + 0.5
}
мой ответ таков:
(1..4).step(0.5)
(1..7).collect{0.5*it}
- лучшее, что я могу придумать