2010-07-07 3 views
56

J'essaie de trouver les valeurs d'intersection entre plusieurs tableaux.rails - Trouver des intersections entre plusieurs tableaux

par exemple

code1 = [1,2,3] 
code2 = [2,3,4] 
code3 = [0,2,6] 

Ainsi, le résultat serait 2

Je sais en PHP, vous pouvez le faire avec array_intersect

Je voulais être en mesure d'ajouter facilement tableau supplémentaire donc je don ne veux pas vraiment utiliser plusieurs boucles

Des idées?

Merci, Alex

Répondre

89

Utilisez la méthode & de Array qui est à l'intersection ensemble.

Par exemple:

> [1,2,3] & [2,3,4] & [0,2,6] 
=> [2] 
+0

@Anurag Etes-vous sûr que cela fonctionne? À moins que je ne comprenne mal les exigences de l'OP, les premier et dernier tableaux ne sont pas testés les uns contre les autres pour l'intersection. Par exemple, '[1,2,3] & [4,5,6] & [1,2,3]' renvoie un tableau vide. – Noz

+0

@Cyle tout élément dans le résultat d'une intersection à trois voies devrait exister dans les trois opérandes. Voir http://en.wikipedia.org/wiki/Intersection_(set_theory) – bdares

34

Si vous voulez un moyen plus simple de le faire avec un tableau de tableaux de longueur inconnue, vous pouvez utiliser inject.

> arrays = [code1,code2,code3] 
> arrays.inject(:&)     # Ruby 1.9 shorthand 
=> [2] 
> arrays.inject{|codes,x| codes & x } # Full syntax works with 1.8 and 1.9 
=> [2] 
+0

'arrays.inject (: &)' ne fonctionnera pas dans 1.9. cela fonctionnera bien 'arrays.inject (: '&')' –

+0

'arrays.inject (: &)' fonctionne pour moi dans 1.9 (1.9.3p429) – Florent2

Questions connexes