グルーヴィー対ルビーoneliner
-
21-09-2019 - |
質問
私は railstutorial を経由すると以下1つのライナーを見ましたP>
('a'..'z').to_a.shuffle[0..7].join
それは次のようにランダムな7文字のドメイン名を作成します:
hwpcbmze.heroku.com
seyjhflo.heroku.com
jhyicevg.heroku.com
私はグルーヴィーに1ライナーを変換してみましたが、私はのみを思い付くことができます:
def range = ('a'..'z')
def tempList = new ArrayList (range)
Collections.shuffle(tempList)
println tempList[0..7].join()+".heroku.com"
上記の改善と1つのライナーに行うことができますか?私は
により、上記のコードは短く作ってみましたprintln Collections.shuffle(new ArrayList ( ('a'..'z') ))[0..7].join()+".heroku.com"
しかし、どうやらCollections.shuffle(new ArrayList ( ('a'..'z') ))
は、A null
解決
シャッフルを持っていない内蔵の長さにほとんど追加されますが、ここでそれをやるその1つのライナーです。
('a'..'z').toList().sort{new Random().nextInt()}[1..7].join()+".heroku.com"
Collections.shuffleは、インプレースshuffleを行いますが、何も返さないので、ユアーズ動作しません。 1つのライナーとして、あなたがこれを行う必要があるだろうと使用するには:
('a'..'z').toList().with{Collections.shuffle(it); it[1..7].join()+".heroku.com"}
他のヒント
これは、ワンライナーではなく、これを行うには、別のGroovyの方法は、Stringにシャッフル方法を追加することです...
String.metaClass.shuffle = { range ->
def r = new Random()
delegate.toList().sort { r.nextInt() }.join()[range]}
そして、あなたが何かを持っている非常にルビーのような...
('a'..'z').join().shuffle(0..7)+'.heroku.com'
これは私の試みです。これは、ワンライナーですが、文字の繰り返しを可能にします。それは、ランダムなドメイン名に適した出力を生成してもそれは、シャッフルを行いません。
私は、再帰的な匿名のクロージャの一例として、それを掲示しています:
{ i -> i > 0 ? "${(97 + new Random().nextInt(26) as char)}" + call(i-1) : "" }.call(7) + ".heroku.com"
これはテッドが述べたように、、Rubyの対応としてはかなり間違いありませんが、 >、それが原因shuffle
方法はCollections
の静的メソッドであるという事実をほとんどです。
[*'a'..'z'].with{ Collections.shuffle it; it }.take(7).join() + '.heroku.com'
私はリストに範囲を変換するために、拡散オペレータのトリックを使用しています:)
所属していません StackOverflow