3

我正在浏览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

4 回答 4

3

Not having shuffle built-in adds the most to the length, but here's a one liner that'll do it:

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

Yours doesn't work because Collections.shuffle does an inplace shuffle but doesn't return anything. To use that as a one liner, you'd need to do this:

('a'..'z').toList().with{Collections.shuffle(it); it[1..7].join()+".heroku.com"}
于 2009-12-29T07:17:17.360 回答
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'
于 2010-01-04T19:56:10.497 回答
0

这绝对不如 Ruby 对应的漂亮,但正如 Ted提到的,这主要是因为shuffle方法是Collections.

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

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

于 2011-11-11T02:08:46.453 回答
0

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

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

{ i -> i > 0 ? "${(97 + new Random().nextInt(26) as char)}" + call(i-1) : "" }.call(7) + ".heroku.com"
于 2010-01-08T03:58:03.397 回答