我正在经历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
答案 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'
我正在使用扩展运算符技巧将范围转换为列表:)