3

私はrailstutorialを通過していて、次の1つのライナーを見ました

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

次のようにランダムな7文字のドメイン名を作成します。

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

ワンライナーをグルーヴィーに変換してみましたが、思いついたのは次のとおりです。

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

シャッフルが組み込まれていないと、長さが最も長くなりますが、これを行う1つのライナーがあります。

('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"}
于 2009-12-29T07:17:17.360 に答える
2

これはワンライナーではありませんが、これを行う別のGroovyの方法は、文字列にシャッフルメソッドを追加することです...

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

そして、あなたは非常にルビーのようなものを持っています...

('a'..'z').join().shuffle(0..7)+'.heroku.com'
于 2010-01-04T19:56:10.497 に答える
0

これが私の試みです。ワンライナーですが、文字の繰り返しが可能です。ランダムなドメイン名に適した出力を生成しますが、シャッフルは実行しません。

再帰的な匿名クロージャの例として投稿します。

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

これは間違いなくRubyの対応物ほどきれいではありませんが、Tedが述べshuffleたように、これは主に、メソッドがの静的メソッドであるという事実によるものですCollections

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

範囲をリストに変換するために、スプレッド演算子のトリックを使用しています:)

于 2011-11-11T02:08:46.453 に答える