Temukan nilai dalam sebuah array

124

Di Ruby, bagaimana saya bisa menemukan nilai dalam array?

Lucas Renan
sumber
Maaf untuk jenis pertanyaan ini, saya pemula di sini, dan saya sedang belajar menggunakan alat ini, saya akan mencoba menemukan jawabannya sebelum memposting di sini.
Lucas Renan
107
Kepada setiap orang yang mengeluh tentang pertanyaan semacam ini: harap baca FAQ: 'Tidak ada pertanyaan yang terlalu sepele atau terlalu "pemula"'. Jika Anda tidak menyukai pertanyaan itu, jangan menjawabnya, dan biarkan orang lain melakukannya. Jika pertanyaan sudah ditanyakan dan dijawab di SO, maka pastikan, tandai sebagai duplikat. Tetapi tidak ada alasan untuk mencaci para pendatang baru karena menjadi orang baru.
Brian Campbell

Jawaban:

117

Saya menebak bahwa Anda mencoba menemukan apakah nilai tertentu ada di dalam array, dan jika demikian, Anda dapat menggunakan Array # include? (Value):

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

Jika Anda bermaksud lain, periksa Ruby Array API

Mark Westling
sumber
1
Saya akan menggunakan Array # index, tetapi memeriksa Ruby Array API adalah tip yang bagus.
Wylliam Judd
82

Menggunakan Array#selectakan memberi Anda larik elemen yang memenuhi kriteria. Tetapi jika Anda mencari cara untuk mengeluarkan elemen dari larik yang memenuhi kriteria Anda, Enumerable#detectakan menjadi cara yang lebih baik untuk melakukannya:

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

Jika tidak, Anda harus melakukan sesuatu yang canggung seperti:

found = array.select {|e| e == 3}.first
Will Warner
sumber
Terima kasih! Saya tahu tentang Enumerable#selecttetapi #detectitulah yang saya cari.
Justin Adkins
1
array.select{}akan melalui semua elemen dalam array mencari yang cocok dengan kondisi. array.findsebagai gantinya akan mengembalikan elemen pertama yang cocok dengan kondisi. Jadi lebih disukai digunakan array.find{ |e| e == 3 }kemudianarray.select{ |e| e == 3 }.first
Oscar Gonzalez
Saya pikir maksud Anda, .find_index saya tidak tahu apakah ada.find
Ross Attrill
27

Jika Anda ingin menemukan satu nilai dari array, gunakan Array#find:

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

Lihat juga:

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

Untuk mengetahui apakah ada nilai dalam Array, Anda juga dapat menggunakan #in?saat menggunakan ActiveSupport. #in?berfungsi untuk objek apa pun yang merespons #include?:

arr = [1, 6]
6.in? arr                 #=> true
fangxing
sumber
Saya tidak bisa melihat satu pun Array#finddi referensi Ruby. Pasti benda Rails karena orang lain telah menyebutkannya. Hmmm ....
Ross Attrill
1
@Ross Attrill Tidak, Ada di Enumerable, ruby-doc.org/core-2.7.1/Enumerable.html#method-i-find
fangxing
Saya salah berasumsi bahwa acara ruby-doc termasuk dan metode yang diwariskan. Pelajaran penting bagi saya.
Ross Attrill
23

Seperti ini?

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

atau seperti ini?

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

Lihat manual .

Ewan Todd
sumber
16

Menggunakan:

myarray.index "valuetoFind"

Itu akan mengembalikan Anda indeks elemen yang Anda inginkan atau nihil jika array Anda tidak berisi nilai.

Wim Hollebrandse
sumber
9

Jawaban ini untuk semua orang yang menyadari bahwa jawaban yang diterima tidak menjawab pertanyaan seperti yang tertulis saat ini.

Pertanyaannya menanyakan bagaimana menemukan nilai dalam sebuah array. Jawaban yang diterima menunjukkan bagaimana memeriksa apakah suatu nilai ada dalam array.

Sudah ada contoh penggunaan index, jadi saya berikan contoh cara selectpakai.

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.
sumber
@MarkThomas tolong kutip bagian dari jawaban saya yang Anda klaim sebagai pernyataan yang salah dan saya akan dengan senang hati memperbaruinya. Saya berasumsi bahwa kami menggunakan bahasa Inggris di sini (bukan definisi yang dibuat-buat untuk kata-kata). Dan ketika ribuan orang mencari "ruby FIND value in array" di Google, mereka melihat pertanyaan ini sebagai hasil pertama, jadi saya yakin mereka semua akan senang jika benar-benar mendapatkan jawaban yang benar.
Mike S
1
Selain itu, @MarkThomas jika Anda benar maka pertanyaan ini harus ditutup karena merupakan duplikat dari stackoverflow.com/questions/1986386/… , tetapi ada perbedaan fungsional antara "menemukan" dan "memeriksa keberadaan" dalam larik.
Mike S
Saya alergi terhadap orang yang membangkitkan pertanyaan lama dan memberikan sedikit atau tidak ada substansi lagi. Ini sering terjadi. Dalam kasus Anda, meskipun selecttelah diberikan sebagai jawaban pada tahun 2009, Anda memberikan cuplikan sampel yang sedikit lebih baik. Jadi setelah memikirkannya kembali, saya menarik kembali apa yang saya katakan sebelumnya.
Mark Thomas
8

Saya tahu pertanyaan ini telah dijawab, tetapi saya datang ke sini mencari cara untuk memfilter elemen dalam Array berdasarkan beberapa kriteria. Jadi, inilah contoh solusi saya: menggunakan select, saya menemukan semua konstanta di Kelas yang dimulai dengan "RUBY_"

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

PEMBARUAN: Sementara itu, saya telah menemukan bahwa Array # grep bekerja jauh lebih baik. Untuk contoh di atas,

Class.constants.grep /^RUBY_/

berhasil.

mydoghasworms
sumber
1
Sementara itu, saya telah menemukan bahwa Array # grep bekerja jauh lebih baik. Bahkan untuk contoh di atas, Class.constants.grep /^RUBY_/lakukan triknya.
mydoghasworms
1

Terima kasih atas balasannya.

Saya suka ini:

puts 'find' if array.include?(value)
Lucas Renan
sumber
1

Anda dapat menggunakan metode array.

Untuk melihat semua metode array gunakan methodsfungsi dengan array. Sebagai contoh,

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

Dengan cara Anda dapat menggunakan metode yang berbeda untuk memeriksa nilai dalam array yang dapat Anda gunakan a.include?("name").

Foram Thakral
sumber