Bir dizide değer bul


124

Ruby'de bir dizide bir değeri nasıl bulabilirim?


Bu tür sorular için özür dilerim, burada acemiyim ve bu aracı kullanmayı öğreniyorum, buraya yazmadan önce cevapları bulmaya çalışacağım.
Lucas Renan

107
Bu tür sorulardan şikâyet eden herkese: Lütfen şu SSS'yi okuyun: 'Hiçbir soru çok önemsiz veya çok "acemi" değildir'. Eğer soruyu beğenmediyseniz, cevaplamayın ve bir başkasının yapmasına izin verin. Soru SO'da zaten sorulmuş ve cevaplanmışsa, o zaman elbette, tekrar olarak işaretleyin. Ancak yeni gelenleri yeni oldukları için azarlamak için hiçbir neden yok.
Brian Campbell

Yanıtlar:


117

Dizi içinde belirli bir değer olup olmadığını bulmaya çalıştığınızı tahmin ediyorum ve durum buysa, Array # include? (Değer) 'i kullanabilirsiniz:

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

Başka bir şeyi kastediyorsanız, Ruby Array API'sini kontrol edin


1
Array # indeksini kullanırdım, ancak Ruby Array API'sini kontrol etmek harika bir ipucu.
Wylliam Judd

83

Kullanmak Array#selectsize kriterleri karşılayan bir dizi öğe verecektir. Ancak, ölçütlerinizi karşılayan öğeyi diziden çıkarmanın bir yolunu arıyorsanız, gitmenin Enumerable#detectdaha iyi bir yolu olacaktır:

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

Aksi takdirde, aşağıdaki gibi garip bir şey yapmanız gerekir:

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

Teşekkürler! Biliyordum Enumerable#selectama #detecttam olarak aradığım şey buydu.
Justin Adkins

1
array.select{}koşula uyanlara bakarak dizideki tüm öğeleri gözden geçirecektir. array.findbunun yerine koşulla eşleşen ilk öğeyi döndürür. Yani tercih kullanım array.find{ |e| e == 3 }sonraarray.select{ |e| e == 3 }.first
Oscar Gonzalez

Sanırım var mı .find_index bilmiyorum demek .find
istedin

27

Diziden bir değer bulmak istiyorsanız, şunu kullanın Array#find:

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

Ayrıca bakınız:

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

Bir #in?Dizide bir değer olup olmadığını bulmak için ActiveSupport kullanırken de kullanabilirsiniz . #in?şunlara yanıt veren herhangi bir nesne için çalışır #include?:

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

Array#findRuby referanslarında hiç göremiyorum . Başkaları bahsettiğinden beri bir Rails olayı olmalı. Hmmm ....
Ross Attrill

1
@Ross Attrill Hayır, yayınlandı Enumerable, ruby-doc.org/core-2.7.1/Enumerable.html#method-i-find
fangxing

Ruby-doc'ın dahil edilen ve miras alınan yöntemleri gösterdiğini yanlış bir şekilde varsaydım. Benim için önemli ders.
Ross Attrill

23

Bunun gibi?

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

veya bunun gibi mi?

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

Kılavuza bakın .



16

kullanın:

myarray.index "valuetoFind"

Bu size istediğiniz öğenin dizinini döndürecektir veya diziniz değeri içermiyorsa sıfır olacaktır.


9

Bu cevap, kabul edilen cevabın şu anda yazıldığı şekliyle soruyu ele almadığını fark eden herkes içindir.

Soru , bir dizide bir değerin nasıl bulunacağını sorar . Kabul cevap gösterileri nasıl bir değer olup olmadığını kontrol etmek için var olan bir dizide.

Zaten kullanan bir örnek var index, bu yüzden selectyöntemi kullanarak bir örnek veriyorum .

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 lütfen cevabımın yanlış bir ifade olduğunu iddia ettiğiniz kısmını alıntılayın ve memnuniyetle güncelleyeceğim. Burada İngilizce kullandığımızı varsayıyorum (kelimeler için yapılan tanımlamalar değil). Ve binlerce kişi Google’da "dizide yakut bul değeri" araması yaptığında, bu soruyu ilk sonuç olarak görüyorlar, bu yüzden eminim hepsi doğru yanıtı almayı çok isterdi.
Mike S

1
Ayrıca, @MarkThomas eğer doğruysanız, bu soru stackoverflow.com/questions/1986386/… ' nin kopyası olduğu için kapatılmalıdır , ancak bir dizide "bulmak" ve "var olup olmadığını kontrol etmek" arasında işlevsel bir fark vardır.
Mike S

Eski soruları yeniden canlandıran ve çok az veya hiç madde sağlamayan insanlara alerjim var. Bu çok oluyor. Sizin durumunuzda, select2009'da zaten bir cevap olarak verilmiş olmasına rağmen , biraz daha iyi olan bir örnek pasaj verdiniz. Bu yüzden yeniden düşündükten sonra, daha önce söylediklerimi geri çekiyorum.
Mark Thomas

8

Bu sorunun zaten yanıtlandığını biliyorum, ancak buraya bir Dizideki öğeleri bazı kriterlere göre filtrelemenin bir yolunu aramaya geldim. İşte çözüm selectörneğim : kullanarak , Sınıfta "RUBY_" ile başlayan tüm sabitleri buluyorum

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

GÜNCELLEME: Bu arada, Array # grep'in çok daha iyi çalıştığını keşfettim. Yukarıdaki örnek için,

Class.constants.grep /^RUBY_/

hile yaptı.


1
Bu arada Array # grep'in çok daha iyi çalıştığını keşfettim. Yukarıdaki örnek için bile Class.constants.grep /^RUBY_/hile yaptı.
mydoghasworms

1

Cevaplarınız için teşekkürler.

Bunu beğendim:

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

1

Dizi yöntemlerine gidebilirsiniz.

Tüm dizi yöntemlerini görmek için dizi methodsile işlevi kullanın . Örneğin,

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

Bu arada dizideki değeri kontrol etmek için farklı yöntemler kullanabilirsiniz a.include?("name").

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.