【问题标题】:ruby oneliner vs groovyruby oneliner vs groovy
【发布时间】:2010-12-30 16:29:40
【问题描述】:

我正在浏览 railstutorial 并看到以下一个班轮

('a'..'z').to_a.shuffle[0..7].join

它会创建随机的 7 个字符的域名,如下所示:

 hwpcbmze.heroku.com
 seyjhflo.heroku.com
 jhyicevg.heroku.com

我尝试将一个班轮转换为 groovy,但我只能想出:

def range = ('a'..'z')
def tempList = new ArrayList (range)
Collections.shuffle(tempList)
println tempList[0..7].join()+".heroku.com"

上面的内容可以改进并制成一个班轮吗?我试图通过

来缩短上面的代码
println Collections.shuffle(new ArrayList ( ('a'..'z') ))[0..7].join()+".heroku.com"

但是,显然Collections.shuffle(new ArrayList ( ('a'..'z') ))null

【问题讨论】:

    标签: arrays ruby groovy language-comparisons


    【解决方案1】:

    没有内置 shuffle 会增加长度,但这里有一个可以做到的:

    ('a'..'z').toList().sort{new Random().nextInt()}[1..7].join()+".heroku.com"
    

    你的不起作用,因为 Collections.shuffle 会进行就地随机播放,但不会返回任何内容。要将其用作一个衬里,您需要这样做:

    ('a'..'z').toList().with{Collections.shuffle(it); it[1..7].join()+".heroku.com"}
    

    【讨论】:

    • 不错...稍微短一点:('a'..'z').toList().sort{Math.random()}[1..7].join()+" .heroku.com"
    • 请注意,Java 7 有时会失败,因为他们已默认使用 Timsort,并且希望两个值之间的比较保持不变。
    【解决方案2】:

    它不是单行的,但另一种 Groovy 方法是向 String 添加 shuffle 方法...

    String.metaClass.shuffle = { range ->
    def r = new Random()
    delegate.toList().sort { r.nextInt() }.join()[range]}
    

    然后你有一些非常像 Ruby 的东西......

    ('a'..'z').join().shuffle(0..7)+'.heroku.com'
    

    【讨论】:

    • 我最喜欢这个;我认为是 Groovier 解决方案 =D 虽然我认为使用Collections.shuffle 在扩展方法中完成工作会更清晰一些。
    【解决方案3】:

    这是我的尝试。它是单行的,但允许重复字符。它不会执行随机播放,但会为随机域名生成合适的输出。

    我将它作为递归匿名闭包的示例发布:

    { i -> i > 0 ? "${(97 + new Random().nextInt(26) as char)}" + call(i-1) : "" }.call(7) + ".heroku.com"
    

    【讨论】:

      【解决方案4】:

      这绝对不如 Ruby 对应的漂亮,但正如 Ted mentioned 一样,这主要是因为 shuffle 方法是 Collections 中的静态方法。

      [*'a'..'z'].with{ Collections.shuffle it; it }.take(7).join() + '.heroku.com'
      

      我正在使用扩展运算符技巧将范围转换为列表:)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-02-03
        • 2015-08-23
        • 2010-11-15
        • 1970-01-01
        • 1970-01-01
        • 2010-12-16
        相关资源
        最近更新 更多