Trova il valore in un array


124

In Ruby, come posso trovare un valore in un array?


Scusami per questo tipo di domanda, sono un principiante qui e sto imparando a usare questo strumento, cercherò di trovare le risposte prima di postare qui.
Lucas Renan,

107
A tutti coloro che si lamentano di questo tipo di domande: leggere la FAQ: "Nessuna domanda è troppo banale o troppo" principiante "". Se la domanda non ti piace, non rispondere e lascia che lo faccia qualcun altro. Se la domanda è già stata posta e risposta su SO, allora certo, contrassegnala come duplicata. Ma non c'è motivo di rimproverare i nuovi arrivati ​​per essere nuovi.
Brian Campbell

Risposte:


117

Immagino che tu stia cercando di scoprire se un determinato valore esiste all'interno dell'array e, in tal caso, puoi utilizzare Array # include? (Value):

a = [1,2,3,4,5]
a.include?(3)   # => true
a.include?(9)   # => false

Se intendi qualcos'altro, controlla l' API Ruby Array


1
Vorrei usare Array # index, ma controllare l'API di Ruby Array è un ottimo suggerimento.
Wylliam Judd

82

L'utilizzo Array#selectti darà una serie di elementi che soddisfano i criteri. Ma se stai cercando un modo per estrarre l'elemento dall'array che soddisfi i tuoi criteri, Enumerable#detectsarebbe un modo migliore per andare:

array = [1,2,3]
found = array.select {|e| e == 3} #=> [3]
found = array.detect {|e| e == 3} #=> 3

Altrimenti dovresti fare qualcosa di imbarazzante come:

found = array.select {|e| e == 3}.first

Grazie! Lo sapevo Enumerable#selectma #detectè esattamente quello che stavo cercando.
Justin Adkins,

1
array.select{}esaminerà tutti gli elementi dell'array cercando quelli che corrispondono alla condizione. array.findrestituirà invece il primo elemento che corrisponde alla condizione. Quindi uso preferibile array.find{ |e| e == 3 }quindiarray.select{ |e| e == 3 }.first
Oscar Gonzalez

Penso che .find_index.find
volessi

27

Se vuoi trovare un valore dall'array, usa Array#find:

arr = [1,2,6,4,9] 
arr.find {|e| e%3 == 0}   #=>  6

Guarda anche:

arr.select {|e| e%3 == 0} #=> [ 6, 9 ]
e.include? 6              #=> true

Per scoprire se esiste un valore in un array è possibile utilizzarlo anche #in?quando si utilizza ActiveSupport. #in?funziona per qualsiasi oggetto che risponde a #include?:

arr = [1, 6]
6.in? arr                 #=> true

Non ne vedo nessuna Array#findnei riferimenti Ruby. Deve essere una cosa di Rails visto che altre persone ne hanno parlato. Hmmm ...
Ross Attrill

1
@Ross Attrill No, It's in Enumerable, ruby-doc.org/core-2.7.1/Enumerable.html#method-i-find
fangxing

Ho erroneamente presunto che ruby-doc mostri metodi inclusi ed ereditati. Importante lezione per me.
Ross Attrill

23

Come questo?

a = [ "a", "b", "c", "d", "e" ]
a[2] +  a[0] + a[1]    #=> "cab"
a[6]                   #=> nil
a[1, 2]                #=> [ "b", "c" ]
a[1..3]                #=> [ "b", "c", "d" ]
a[4..7]                #=> [ "e" ]
a[6..10]               #=> nil
a[-3, 3]               #=> [ "c", "d", "e" ]
# special cases
a[5]                   #=> nil
a[5, 1]                #=> []
a[5..10]               #=> []

o così?

a = [ "a", "b", "c" ]
a.index("b")   #=> 1
a.index("z")   #=> nil

Vedere il manuale .



16

Uso:

myarray.index "valuetoFind"

Questo ti restituirà l'indice dell'elemento che desideri o nullo se il tuo array non contiene il valore.


9

Questa risposta è per tutti coloro che si rendono conto che la risposta accettata non affronta la domanda come è attualmente scritta.

La domanda chiede come trovare un valore in un array. La risposta accettata mostra come verificare se un valore esiste in un array.

Esiste già un esempio che utilizza index, quindi sto fornendo un esempio utilizzando il selectmetodo.

1.9.3-p327 :012 > x = [1,2,3,4,5]
  => [1, 2, 3, 4, 5] 
1.9.3-p327 :013 > x.select {|y| y == 1}
  => [1]

@MarkThomas, per favore, cita la parte della mia risposta che stai sostenendo è un'affermazione errata e sarò lieto di aggiornarla. Presumo che stiamo usando l'inglese qui (non definizioni inventate per le parole). E quando migliaia di persone cercano "ruby FIND value in array" in Google, vedono questa domanda come il primo risultato, quindi sono sicuro che a tutti piacerebbe ottenere effettivamente la risposta corretta.
Mike S

1
Inoltre, @MarkThomas se tu avessi ragione, allora questa domanda dovrebbe essere chiusa perché duplicata di stackoverflow.com/questions/1986386/… , ma c'è una differenza funzionale tra "trovare" e "verificare l'esistenza" in un array.
Mike S

Sono allergico alle persone che riesumano vecchie domande e forniscono poca o nessuna sostanza più. Succede spesso. Nel tuo caso, sebbene selectfosse già stato fornito come risposta nel 2009, hai fornito uno snippet di esempio che è leggermente migliore. Quindi, dopo averlo ripensato, ritiro ciò che ho detto prima.
Mark Thomas

8

So che a questa domanda è già stata data una risposta, ma sono venuto qui alla ricerca di un modo per filtrare gli elementi in un array in base ad alcuni criteri. Quindi ecco il mio esempio di soluzione: utilizzando select, trovo tutte le costanti in Class che iniziano con "RUBY_"

Class.constants.select {|c| c.to_s =~ /^RUBY_/ }

AGGIORNAMENTO: Nel frattempo ho scoperto che Array # grep funziona molto meglio. Per l'esempio sopra,

Class.constants.grep /^RUBY_/

ha fatto il trucco.


1
Nel frattempo ho scoperto che Array # grep funziona molto meglio. Anche per l'esempio sopra, Class.constants.grep /^RUBY_/ha funzionato.
mydoghasworms

1

Grazie per le risposte.

Mi è piaciuto questo:

puts 'find' if array.include?(value)

1

Puoi scegliere metodi array.

Per vedere tutti i metodi dell'array usa methodsfunction con array. Per esempio,

a = ["name", "surname"] 
a.methods

A proposito, puoi usare metodi diversi per controllare il valore nell'array. Puoi usare a.include?("name").

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.