2015-04-20 11 views
5

Sto cercando di imparare come cercare all'interno di un array bidimensionale; per esempio:Come cercare all'interno di un array bidimensionale

array = [[1,1], [1,2], [1,3], [2,1], [2,4], [2,5]] 

Voglio sapere come cercare all'interno della matrice per le matrici che sono di forma [1, y] e poi mostrare ciò che gli altri y numeri sono: [1, 2, 3].

Se qualcuno può aiutarmi a capire come cercare solo con i numeri (poiché molti degli esempi che ho trovato includono stringhe o hash) e anche dove cercare le risorse giuste, sarebbe utile.

+0

Questa parte non è chiaro: 'Come cercare solo con i numeri (come un sacco degli esempi che ho trovato includono stringhe o hash) '. Puoi aggiungere degli esempi per mostrare cosa intendi? – sawa

+0

Mi è stato dato il suggerimento che sarebbe stato qualcosa come array.each {| i | ...} ma non so come applicarlo ... Mi dispiace per una domanda così fondamentale. – Kumo

+0

@sawa Scusa, volevo dire che volevo essere in grado di cercare gli array che contengono il numero 1 (nella posizione [0]) e restituire l'altro numero associato. In questo caso, mi piacerebbe essere in grado di cercare nell'intero array cercando gli array interni che hanno il primo numero come 1. Alla fine, mi piacerebbe scoprire quanti oggetti hanno il numero 1 nella prima posizione e quali sono i rispettivi numeri partner (1, 2, 3). Ciò presuppone che non riesco a vedere i numeri negli array in primo luogo. – Kumo

risposta

5

Ruby consente di esaminare un elemento utilizzando le parentesi nell'argomento di blocco. select e map assegnare solo un unico argomento di blocco, ma si può guardare in l'elemento:

array.select{|(x, y)| x == 1} 
# => [[1, 1], [1, 2], [1, 3]] 

array.select{|(x, y)| x == 1}.map{|(x, y)| y} 
# => [1, 2, 3] 

È possibile omettere le parentesi che corrispondono alla intera espressione tra |...|:

array.select{|x, y| x == 1} 
# => [[1, 1], [1, 2], [1, 3]] 

array.select{|x, y| x == 1}.map{|x, y| y} 
# => [1, 2, 3] 

Come uno stile di codifica , è una consuetudine per contrassegnare le variabili non utilizzate come _:

array.select{|x, _| x == 1} 
# => [[1, 1], [1, 2], [1, 3]] 

array.select{|x, _| x == 1}.map{|_, y| y} 
# => [1, 2, 3] 
+0

Grazie per averlo smontato per me, è molto chiaro! Anche il _ è bello sapere per convenzione. – Kumo

6

È possibile utilizzare Array#select e Array#map metodi:

array = [[1,1], [1,2], [1,3], [2,1], [2,4], [2,5]] 
#=> [[1, 1], [1, 2], [1, 3], [2, 1], [2, 4], [2, 5]] 
array.select { |el| el[0] == 1 } 
#=> [[1, 1], [1, 2], [1, 3]] 
array.select { |el| el[0] == 1 }.map {|el| el[1] } 
#=> [1, 2, 3] 

Per ulteriori metodi sugli array esplorare docs.

+0

Grazie mille! Questo ha senso e apprezzo il collegamento. – Kumo

+0

Ah, ho appena saputo che puoi solo controllare una risposta !? Questa risposta è stata chiara da chi ho finito il controllo e l'ho ulteriormente rotto, cosa che mi ha reso più facile capire questo. – Kumo

+0

@Kumo Sono assolutamente d'accordo con la tua scelta, la risposta di sawa contiene grandi spiegazioni. Buona fortuna per l'apprendimento di Ruby! Puoi anche sviare le risposte utili se hai una reputazione sufficiente (non ricordare quanto dovrebbe essere esattamente) –

1

Un altro modo di fare la stessa cosa è usare Array#map insieme a Array#compact. Questo ha il vantaggio di richiedere solo un blocco e un'operazione banale, che lo rende un po 'più facile da comprendere.

array.map { |a, b| a if b == 1 } 
#=> [1, 2, 3, nil, nil, nil] 
array.map { |a, b| a if b == 1 }.compact 
#=> [1, 2, 3] 
+0

Grazie! Questo è stato bello, pulito e aveva senso dopo aver letto quanto sopra. – Kumo

+0

Un punto minore, ma questo è in realtà indietro ('array.map {| a, b | b se a == 1}'). C'è un problema, tuttavia: 'array = [[1,2], [1, nil]] # => [2]', mentre '=> [2, nil]' è richiesto. –

5

Se si seleziona innanzitutto e poi mappa È possibile utilizzare la funzione di grep per per tutto in una sola funzione:

p array.grep ->x{x[0]==1}, &:last #=> [1,2,3] 
+0

follemente fantastico! +1 –

1

È possibile utilizzare each_with_object:

array.each_with_object([]) { |(x, y), a| a << y if x == 1 } 
#=> [1, 2, 3] 
Problemi correlati