红宝石oneliner vs groovy

时间:2009-12-29 04:47:49

标签: arrays ruby groovy language-comparisons

我正在经历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

4 个答案:

答案 0 :(得分:3)

没有内置的随机播放会增加最长的内容,但是这里有一个内容可以做到:

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

你的工作不起作用,因为Collections.shuffle会进行inplace shuffle但不会返回任何内容。要将其用作单线,您需要这样做:

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

答案 1 :(得分: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'

答案 2 :(得分:0)

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

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

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

答案 3 :(得分:0)

这绝对不如Ruby版本那么漂亮,但是,作为Ted mentioned,这主要是因为shuffle方法是Collections中的静态方法。

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

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