代码之家  ›  专栏  ›  技术社区  ›  Michael Borgwardt

0.5步长的Groovy系列

  •  10
  • Michael Borgwardt  · 技术社区  · 16 年前

    在Groovy中,指定一系列整数以及它们之间的0.5步的最简单方式是什么?e、 g.:1,1.5,2,2.5,3,3.5,4

    编辑: 澄清一下:作为最终结果,我需要一个用于Grails约束的范围对象。不过我想一份清单也可以。

    8 回复  |  直到 16 年前
        1
  •  30
  •   kgrad    16 年前

    我能看到的最好方法是使用step命令。

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

    打印出来:“1.5 2.0 2.5 3.0 3.5”

        2
  •  5
  •   Reverend Gonzo    15 年前

    有点晚了,但这也行

    以上一套的一行:

    (2..8)*.分区(2)

        3
  •  1
  •   billjamesdev    15 年前

    苏,在上面继续。测试值val是否在1.范围内。。n但有一半的值:

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

    类似的东西可以工作,但没有我想要的那么漂亮,但是如果你需要的话,它可以让你建立一个范围并多次使用它。

        4
  •  0
  •   chanwit    16 年前

    仅供参考,从Groovy 1.6.0开始,它似乎不支持本机。只存在ObjectRange。目前的步骤(int)。

    http://groovy.codehaus.org/api/groovy/lang/ObjectRange.html#step%28int%29

        5
  •  0
  •   Allen    16 年前

    欺骗

    将所需范围映射到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;
       ...}
    
        6
  •  0
  •   Matt Christianson    15 年前
    def r = []
    (0..12).each() {
      r << it
      r << it + 0.5
    }
    
        7
  •  0
  •   Florent Joice    12 年前

    我的答案如下:

    (1..4).step(0.5)
    
        8
  •  0
  •   Undo ptrk    10 年前

    (1..7).collect{0.5*it} 是我能想到的最好的