Znajdź wartość w tablicy

124

W Rubim, jak mogę znaleźć wartość w tablicy?

Lucas Renan
źródło
Przepraszam za tego typu pytanie, jestem tutaj nowicjuszem i uczę się korzystać z tego narzędzia, spróbuję znaleźć odpowiedzi przed wysłaniem tutaj.
Lucas Renan
107
Do wszystkich, którzy narzekają na tego typu pytania: przeczytaj FAQ: „Żadne pytanie nie jest zbyt trywialne lub zbyt„ nowicjusz ””. Jeśli nie podoba ci się to pytanie, nie odpowiadaj na nie i pozwól zrobić to komuś innemu. Jeśli pytanie zostało już zadane i udzielono na nie odpowiedzi, oznacz je jako duplikat. Ale nie ma powodu, by krytykować nowoprzybyłych za to, że są nowi.
Brian Campbell

Odpowiedzi:

118

Zgaduję, że próbujesz sprawdzić, czy w tablicy istnieje pewna wartość, a jeśli tak jest, możesz użyć Array # include? (Wartość):

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

Jeśli masz na myśli coś innego, sprawdź interfejs API Ruby Array

Mark Westling
źródło
1
Użyłbym indeksu Array #, ale sprawdzenie interfejsu API Ruby Array to świetna wskazówka.
Wylliam Judd
83

Użycie Array#selectda ci tablicę elementów spełniających kryteria. Ale jeśli szukasz sposobu na usunięcie elementu z tablicy, który spełnia Twoje kryteria, Enumerable#detectbyłby to lepszy sposób:

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

W przeciwnym razie musiałbyś zrobić coś niezręcznego, takiego jak:

found = array.select {|e| e == 3}.first
Will Warner
źródło
Dzięki! Wiedziałem o tym, Enumerable#selectale #detectwłaśnie tego szukałem.
Justin Adkins,
1
array.select{}przejdzie przez wszystkie elementy w tablicy, szukając tych, które pasują do warunku. array.findzamiast tego zwróci pierwszy element spełniający warunek. Tak więc korzystne stosowanie array.find{ |e| e == 3 }następniearray.select{ |e| e == 3 }.first
Oscar Gonzalez
Myślę, że miałeś na myśli .find_index , że nie wiem, czy istnieje.find
Ross Attrill
28

Jeśli chcesz znaleźć jedną wartość z tablicy, użyj Array#find:

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

Zobacz też:

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

Aby sprawdzić, czy wartość istnieje w tablicy, możesz również użyć jej #in?podczas korzystania z ActiveSupport. #in?działa dla każdego obiektu, który reaguje na #include?:

arr = [1, 6]
6.in? arr                 #=> true
fangxing
źródło
Nie widzę żadnego Array#findw odniesieniach do Rubiego. To musi być sprawa Railsów, skoro inni o tym wspominali. Hmmm ...
Ross Attrill
1
@Ross Attrill nie, to w Enumerable, ruby-doc.org/core-2.7.1/Enumerable.html#method-i-find
fangxing
Błędnie założyłem, że ruby-doc pokazuje włączone i odziedziczone metody. Ważna lekcja dla mnie.
Ross Attrill
23

Lubię to?

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]               #=> []

lub tak?

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

Zobacz instrukcję .

Ewan Todd
źródło
16

Posługiwać się:

myarray.index "valuetoFind"

To zwróci ci indeks żądanego elementu lub zero, jeśli twoja tablica nie zawiera wartości.

Wim Hollebrandse
źródło
9

Ta odpowiedź jest dla każdego, kto zdaje sobie sprawę, że zaakceptowana odpowiedź nie odpowiada na pytanie tak, jak jest obecnie napisane.

Pytanie dotyczy tego, jak znaleźć wartość w tablicy. Zaakceptowana odpowiedź pokazuje, jak sprawdzić, czy wartość istnieje w tablicy.

Jest już przykład użycia index, więc podaję przykład przy użyciu selectmetody.

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]
Mike S.
źródło
@MarkThomas, proszę, zacytuj część mojej odpowiedzi, która Twoim zdaniem jest błędna, a ja chętnie ją zaktualizuję. Zakładam, że używamy tutaj angielskiego (nie zmyślonych definicji słów). A kiedy tysiące ludzi wyszukuje w Google hasło „ruby ZNAJDŹ wartość w tablicy”, widzą to pytanie jako pierwszy wynik, więc jestem pewien, że wszyscy chcieliby uzyskać poprawną odpowiedź.
Mike S
1
Co więcej, @MarkThomas, jeśli miałeś rację, to pytanie powinno zostać zamknięte, ponieważ jest duplikatem stackoverflow.com/questions/1986386/ ... , ale istnieje funkcjonalna różnica między „znajdowaniem” a „sprawdzaniem istnienia” w tablicy.
Mike S
Mam alergię na ludzi, którzy wskrzeszają stare pytania i dostarczają niewiele więcej treści. To się często zdarza. W twoim przypadku, mimo że selectzostała już udzielona jako odpowiedź w 2009 r., Podałeś przykładowy fragment kodu, który jest trochę lepszy. Więc po przemyśleniu tego, cofam to, co powiedziałem wcześniej.
Mark Thomas
8

Wiem, że na to pytanie już udzielono odpowiedzi, ale przyszedłem tutaj, szukając sposobu na filtrowanie elementów w tablicy na podstawie pewnych kryteriów. Oto przykład mojego rozwiązania: używając select, znajduję wszystkie stałe w klasie zaczynające się od „RUBY_”

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

AKTUALIZACJA: W międzyczasie odkryłem, że Array # grep działa znacznie lepiej. W powyższym przykładzie

Class.constants.grep /^RUBY_/

załatwił sprawę.

mydoghasworms
źródło
1
W międzyczasie odkryłem, że Array # grep działa znacznie lepiej. Nawet w powyższym przykładzie Class.constants.grep /^RUBY_/załatwił sprawę.
mydoghasworms
1

Dzięki za odpowiedzi.

Podobało mi się to:

puts 'find' if array.include?(value)
Lucas Renan
źródło
1

Możesz przejść do metod tablicowych.

Aby zobaczyć wszystkie metody tablicowe, użyj methodsfunkcji function z tablicą. Na przykład,

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

Przy okazji możesz użyć innej metody sprawdzania wartości w tablicy Możesz użyć a.include?("name").

Foram Thakral
źródło