2011-04-01 21 views
19

Estoy comparando códigos postales.¿Cómo comparar el contenido de dos matrices?

que tienen tres constantes de códigos postales:

ZIP_MORRIS 
ZIP_UNION 
ZIP_ESSEX 

Quiero ver si un usuario tiene en el arsenal de un objeto, todas las cremalleras incluido en uno de esos.

yo probamos este:

ZIP_UNION.sort{|x,y| y <=> x} <=> Email.find(3).distributions.map(&:zip_code).uniq.compact.sort{|x,y| y <=> x} 

Pero, por desgracia, esto sólo asigna todos los códigos postales, por lo que si tuviera que elegir uno poco más de agarre en un condado diferente, entonces sería no se pueden comparar adecuadamente.

Creo que la mejor solución sería comparar los valores de las cremalleras generadas por el usuario, y ver si todas las cremalleras en una ZIP_COUNTY están presentes dentro de la matriz.

Algún tipo de iterador que se ejecuta en todas las cremalleras y garantiza que el archivo zip del usuario incluya o no todos los archivos zip en un grupo zip.

¿Alguna idea?

Respuesta

67

usted puede hacer diferencias array, si el resultado es la matriz vacía, los 2 arrays contenía los mismos elementos:

>> [1,2,3]-[3,1,2] #=> [] 

Si todavía tiene elementos de la izquierda, luego no todos los elementos del primer conjunto estaban presentes en el el segundo:

>> [1,2,5]-[3,1,2] #=> [5] 
+4

La simplicidad se lleva la palma. – Trip

+1

@Trip: Simplicidad por necesidad. En nuestra aplicación, a menudo tengo que hacer algo muy similar con matrices de ID de hasta varios cientos de miles de elementos. Todos los demás métodos demostraron ser demasiado lentos. –

+13

Esta solución funciona para el ejemplo específico en la pregunta de @ Trip, pero no para el caso general. Tendrá que hacer la operación de diferencia dos veces: # donde el número de elementos no coincide [1] - [1,2] # => [] [1,2] - [1] # => [2] # donde hay dups dentro de los elementos [1,1,2] - [2,2,1] # => [] [2,2,1] - [1,1,2] # => [] – bobics

8

A continuación uso el todo? operador en una matriz, que devolverá verdadero si todos los elementos de la matriz devuelven true para el bloque que estoy pasando.

my_zip = [1,2,3,4,5,6] 
[2,3,5].all?{|z| my_zip.include?(z)} 
=> true 
[20,3,5].all?{|z| my_zip.include?(z)} 
=> false 

usted acaba de cambiar hasta que los códigos postales del usuario

+0

Casi ... los tengo seleccionados a todos por lo que ** debería ** mostrarse como verdadero. Pero no es así Lo asumo porque también incluye otras cremalleras que no están necesariamente en 'my_zip' y no. – Trip

+1

Dependiendo de la longitud de las 2 matrices, esto podría ser muy lento. –

5
> [1,2,3] <=> [1,2,3] 
=> 0 
> [1,2,3] <=> [2,2,3] 
=> -1 
> [1,2,3] <=> [3,2,3] 
=> -1 
> [1,2,3] <=> [1,3,3] 
=> -1 
> [1,2,3] <=> [1,1,3] 
=> 1 

esto es de RailsThinker Post y ha estado trabajando para mí muy bien.

+0

¡Gracias !, gran operador, especialmente cuando quiere comparar versiones semánticas. – MhdSyrwan

Cuestiones relacionadas