2009-12-29 5 views
3

je traversais railstutorial et a été caractérisé par une doublureoneliner rubis vs groovy

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

il crée le nom de domaine aléatoire 7 caractères comme suit:

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

J'ai essayé de convertir une doublure pour groovy mais je ne pouvais que trouver:

def range = ('a'..'z') 
def tempList = new ArrayList (range) 
Collections.shuffle(tempList) 
println tempList[0..7].join()+".heroku.com" 

Est-ce que ce qui précède peut être amélioré? et fait à un seul paquebot? J'ai essayé de rendre le code ci-dessus plus court par

println Collections.shuffle(new ArrayList (('a'..'z')))[0..7].join()+".heroku.com" 

Cependant, apparemment Collections.shuffle(new ArrayList (('a'..'z'))) est un null

Répondre

3

Ne pas avoir aléatoire intégré ajoute le plus à la longueur, mais voici une doublure qui va le faire :

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

vôtre ne fonctionne pas parce que Collections.shuffle fait un remaniement inplace mais ne retourne rien. Pour l'utiliser comme une seule ligne, vous aurez besoin de le faire:

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

belle ... légèrement plus courte:.. ('A' .. 'z') toList() sort { Math.random()} [1..7] .join() + ". Heroku.com" – mbrevoort

+0

Soyez conscient que cela échouera parfois avec Java 7 car ils ont déplacé pour utiliser Timsort par défaut et qui attend des comparaisons entre 2 les valeurs restent constantes. –

2

Il n'est pas une seule ligne, mais une autre façon Groovy faire est d'ajouter une méthode de lecture aléatoire à cordes ...

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

Et puis vous avez quelque chose de très Ruby comme ...

('a'..'z').join().shuffle(0..7)+'.heroku.com' 
+1

J'aime celui-ci le plus; Je pense que c'est la solution Groovier = D Bien que je pense que l'utilisation de 'Collections.shuffle' pour que le travail soit fait dans la méthode d'extension serait un peu plus clair. – epidemian

0

C'est ma tentative. C'est un one-liner mais permet la répétition des caractères. Il n'effectue pas de shuffle, bien qu'il génère une sortie appropriée pour un nom de domaine aléatoire.

je signale comme un exemple d'une fermeture anonyme récursive:

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

Ceci est certainement pas aussi jolie que la contrepartie Ruby mais, comme Ted mentioned, il est surtout à cause du fait que shuffle méthode est une méthode statique dans Collections.

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

J'utilise le truc de l'opérateur de diffusion pour convertir la plage dans une liste :)