[RUBY] intersection d'array

intersection d'array [RUBY] - Ruby/Rails - Programmation

Marsh Posté le 10-01-2014 à 13:17:21    

Bonjour
 
Je débute en ruby et je me demande comment construire une liste d'intersection de plusieur table.
 
Je m'explique, j'ai une liste de groupe et j'interroge un spacewalk qui me répond quels sont les serveurs dans ces groupes.
L'intersection se passe normalement avec "&" pour une liste de 2 groupes
 

Code :
  1. irb(main):046:0> ["hostname1", "hostname2", "hostname3", "hostname4", "hostname5"] &  ["hostname1", "hostname2", "hostname3"]
  2. => ["hostname1", "hostname2", "hostname3"]


 
Mais voila, la liste des groupes est de taille variable d'où un "each"... mais là j'en perds un peu mon latin :s
 
Pourriez vous m'indiquer la bonne façon de faire ?
 
 
Merci
 

Code :
  1. irb(main):035:0> liste=["GROUP1", "GROUP2"]
  2. => ["GROUP1", "GROUP2"]
  3. irb(main):036:0> spwk.list_systems_in_group(session_key, "GROUP1" ).map {|i| i["hostname"]}
  4. warning: peer certificate won't be verified in this SSL session
  5. => ["hostname1", "hostname2", "hostname3", "hostname4", "hostname5"]
  6. irb(main):037:0> spwk.list_systems_in_group(session_key, "GROUP1" ).map {|i| i["hostname"]}
  7. warning: peer certificate won't be verified in this SSL session
  8. => ["hostname1", "hostname2", "hostname3"]
  9. irb(main):041:0* res=nil 
  10. => nil
  11. irb(main):042:0> liste.each { |group|
  12. irb(main):043:1* res &= sw_api_client.list_systems_in_group(session_key, group).map {|i| i["hostname"]}
  13. irb(main):044:1> }
  14. warning: peer certificate won't be verified in this SSL session
  15. warning: peer certificate won't be verified in this SSL session
  16. => ["GROUP1", "GROUP2"]
  17. irb(main):045:0> puts res
  18. false
  19. => nil


Reply

Marsh Posté le 10-01-2014 à 13:17:21   

Reply

Marsh Posté le 10-01-2014 à 14:40:03    

je déplace en cat prog


---------------
uptime is for lousy system administrators what Viagra is for impotent people - mes unixeries - github me
Reply

Marsh Posté le 10-01-2014 à 14:40:31    

Ce sujet a été déplacé de la catégorie Linux et OS Alternatifs vers la categorie Programmation par Black_lord


---------------
uptime is for lousy system administrators what Viagra is for impotent people - mes unixeries - github me
Reply

Marsh Posté le 10-01-2014 à 15:09:04    

Merci black_lord

Reply

Marsh Posté le 10-01-2014 à 16:18:56    

Non mais là le problème c'est que tu initialises ton `res` à `nil`. Donc ton premier tour de boucle tu fais un `nil & array`. Et sur NilClass, TrueClass et FalseClass `&` est équivalent à `&&`.
 
Donc `nil & array` -> false, puis tu continues avec `false & array` -> false. Donc t'as un false à la fin, normal.
 
Je décomposerais en deux parties: récupérations des machines puis intersection, et pour l'intersection de tous les sets d'une séquence, un fold:

Code :
  1. result = list.map {|group|
  2.    sw_api_client.list_systems_in_group(session_key, group).map {|s| s['hostname'] }
  3. }.inject {|memo, systems|
  4.    memo & systems
  5. }


un truc du style


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 10-01-2014 à 17:08:16    

ok jevois le genre
 
Merci bien

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed