【问题标题】:Groovy range with a 0.5 step sizeGroovy 范围,步长为 0.5
【发布时间】:2009-02-21 14:52:43
【问题描述】:

在 Groovy 中指定整数范围和它们之间的 0.5 步的最优雅的方式是什么?例如:1、1.5、2、2.5、3、3.5、4

编辑:澄清:作为最终结果,我需要一个范围对象用于 Grails 约束。虽然我想一个列表也可以。

【问题讨论】:

标签: syntax groovy range


【解决方案1】:

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


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

将打印出:“1 1.5 2.0 2.5 3.0 3.5”

【讨论】:

    【解决方案2】:

    有点晚了,但这也可以

    您的上述套装的单线:

    (2..8)*.div(2)

    【讨论】:

      【解决方案3】:

      Soo,以上述为基础。测试值 val 是否在 1..n 范围内但具有一半值:

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

      类似的东西会起作用,但不像我想要的那样漂亮,但它可以让你构建一次范围并多次使用它,如果你需要的话。

      【讨论】:

        【解决方案4】:

        仅供参考,从 Groovy 1.6.0 开始,它似乎不原生支持。目前只存在 ObjectRange.step(int)。

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

        【讨论】:

          【解决方案5】:

          作弊。

          将您想要的范围映射到另一个更容易被 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】:
            def r = []
            (0..12).each() {
              r << it
              r << it + 0.5
            }
            

            【讨论】:

              【解决方案7】:

              我的回答如下:

              (1..4).step(0.5)
              

              【讨论】:

              • @DavidMann No signature of method: groovy.lang.IntRange.step() is applicable for argument types: (java.math.BigDecimal) values: [0.5]
              【解决方案8】:

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

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2015-07-18
                • 2013-11-18
                • 1970-01-01
                • 2010-10-03
                • 1970-01-01
                相关资源
                最近更新 更多