2012-01-19 25 views
12

Tengo dos matrices:¿Cómo comparo elementos de dos matrices?

a = [1,2,3] 
b = [1,4,3] 

¿Existe un método de comparación de elemento a elemento en Ruby tal que podía hacer algo como esto:

a == b 

devuelve:

[1,0,1] o algo parecido [TRUE,FALSE,TRUE].

Respuesta

17

Aquí hay una manera que puedo imaginar.

a = [1, 2, 3] 
b = [1, 4, 3] 

a.zip(b).map { |x, y| x == y } # [true, false, true] 
+0

sup con downvote? – Anurag

+2

¿Por qué no hacer la desestructuración en el parámetro de bloque en su lugar? –

+0

@ JörgWMittag - No sabía que la desestructuración de los argumentos de matriz fuera posible dentro del bloque. – Anurag

-2

intentar algo como esto:

@array1 = ['a', 'b', 'c', 'd', 'e'] 
@array2 = ['d', 'e', 'f', 'g', 'h'] 
@intersection = @array1 & @array2 

@intersection ahora debe estar [ 'd', 'e'].

Intersección: devuelve una nueva matriz que contiene elementos comunes a las dos matrices, sin duplicados.

Incluso puede probar algunos de los trucos de rubí como las siguientes:

array1 = ["x", "y", "z"] 
array2 = ["w", "x", "y"] 
array1 | array2 # Combine Arrays & Remove Duplicates(Union) 
=> ["x", "y", "z", "w"] 

array1 & array2 # Get Common Elements between Two Arrays(Intersection) 
=> ["x", "y"] 


array1 - array2 # Remove Any Elements from Array 1 that are 
       # contained in Array 2 (Difference) 
=> ["z"] 
+1

Esto no devuelve lo que el PO quería. –

2

Usted puede hacer algo como esto para conseguir exactamente lo que quiere:

[1,2,3].zip([1,4,3]).map { |a,b| a == b } 
=> [true, false, true] 
2

Esto debe hacer el truco:

array1.zip(array2).map { |a, b| a == b } 

postal crea una matriz de pares que consisten en cada elemento desde ambas matrices en esa posición. Imagine pegar las dos matrices una al lado de la otra.

3
a = [1,2,3] 
b = [1,4,3] 
a.zip(b).map { |pair| pair[0] <=> pair[1] } 
=> [0, -1, 0] 

La comparación elemento-sabia se consigue con el método objeto Array zip Ruby.

a = [1,2,3] 
b = [1,4,3] 
a.zip(b) 
=> [[1, 1], [2, 4], [3, 3]] 
4

También puede utilizar .collect

a.zip(b).collect {|x,y| x==y } 
=> [true, false, true] 
+5

Puede usar 'collect' en lugar de' map'? ¡Guauu! –

+0

'collect' es simplemente un alias para' map'. [Array # collect] (http://www.ruby-doc.org/core-1.9.3/Array.html#method-i-collect) –

Cuestiones relacionadas