ค้นหาค่าในอาร์เรย์


124

ใน Ruby ฉันจะหาค่าในอาร์เรย์ได้อย่างไร


ขออภัยสำหรับคำถามประเภทนี้ฉันเป็นมือใหม่และฉันกำลังเรียนรู้ที่จะใช้เครื่องมือนี้ฉันจะพยายามหาคำตอบก่อนโพสต์ที่นี่
Lucas Renan

107
สำหรับทุกคนที่บ่นเกี่ยวกับคำถามประเภทนี้: โปรดอ่านคำถามที่พบบ่อย: 'ไม่มีคำถามที่ไม่สำคัญเกินไปหรือ "มือใหม่" เกินไป หากคุณไม่ชอบคำถามอย่าตอบคำถามและปล่อยให้คนอื่นทำเช่นนั้น หากคำถามถูกถามและตอบใน SO แล้วให้แน่ใจว่าทำเครื่องหมายว่าซ้ำ แต่ไม่มีเหตุผลที่จะต้องดูถูกผู้มาใหม่ว่าเป็นคนใหม่
Brian Campbell

คำตอบ:


117

ฉันคาดเดาว่าคุณกำลังพยายามค้นหาว่ามีค่าบางอย่างอยู่ในอาร์เรย์หรือไม่และหากเป็นเช่นนั้นคุณสามารถใช้ Array # include? (value):

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

หากคุณหมายถึงอย่างอื่นให้ตรวจสอบRuby Array API


1
ฉันจะใช้ดัชนี Array # แต่การตรวจสอบ Ruby Array API เป็นเคล็ดลับที่ดี
Wylliam Judd

83

การใช้Array#selectจะทำให้คุณมีอาร์เรย์ขององค์ประกอบที่ตรงตามเกณฑ์ แต่ถ้าคุณกำลังมองหาวิธีที่จะนำองค์ประกอบออกจากอาร์เรย์ที่ตรงตามเกณฑ์ของคุณEnumerable#detectจะเป็นวิธีที่ดีกว่า:

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

มิฉะนั้นคุณจะต้องทำสิ่งที่น่าอึดอัดเช่น:

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

ขอบคุณ! ฉันรู้เกี่ยวกับEnumerable#selectแต่#detectเป็นสิ่งที่ฉันกำลังมองหา
Justin Adkins

1
array.select{}จะผ่านองค์ประกอบทั้งหมดในอาร์เรย์โดยมองหาองค์ประกอบที่ตรงกับเงื่อนไข array.findจะส่งคืนองค์ประกอบแรกที่ตรงกับเงื่อนไขแทน ดังนั้นการใช้งานที่นิยมarray.find{ |e| e == 3 }แล้วarray.select{ |e| e == 3 }.first
ออสการ์กอนซาเล

ฉันคิดว่าคุณหมายความว่า.find_index ฉันไม่รู้ว่ามีหรือไม่.find
Ross Attrill

27

หากคุณต้องการค้นหาค่าหนึ่งจากอาร์เรย์ให้ใช้Array#find:

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

ดูสิ่งนี้ด้วย:

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

หากต้องการดูว่ามีค่าอยู่ใน Array หรือไม่คุณสามารถใช้#in?เมื่อใช้ ActiveSupport #in?ทำงานสำหรับวัตถุใด ๆ ที่ตอบสนองต่อ#include?:

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

ฉันไม่เห็นข้อมูลใด ๆArray#findในการอ้างอิง Ruby ต้องเป็นสิ่งที่ Rails เนื่องจากมีคนกล่าวถึง อืม ....
Ross Attrill

1
@Ross Attrill ไม่มีมันอยู่ในEnumerable, ruby-doc.org/core-2.7.1/Enumerable.html#method-i-find
Fangxing

ฉันเดาไม่ถูกต้องว่า Ruby-doc แสดงวิธีการรวมและสืบทอดมา บทเรียนสำคัญสำหรับฉัน
Ross Attrill

23

แบบนี้?

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

หรือแบบนี้?

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

ดูคู่มือการใช้งาน



16

ใช้:

myarray.index "valuetoFind"

ซึ่งจะส่งคืนดัชนีขององค์ประกอบที่คุณต้องการหรือไม่มีถ้าอาร์เรย์ของคุณไม่มีค่า


9

คำตอบนี้มีไว้สำหรับทุกคนที่ตระหนักว่าคำตอบที่ยอมรับไม่ได้ตอบคำถามตามที่เขียนไว้ในปัจจุบัน

คำถามถามว่าจะหาค่าในอาร์เรย์ได้อย่างไร คำตอบที่ยอมรับแสดงวิธีตรวจสอบว่ามีค่าอยู่ในอาร์เรย์หรือไม่

มีตัวอย่างการใช้งานอยู่indexแล้วดังนั้นฉันจึงให้ตัวอย่างโดยใช้selectวิธีการ

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 โปรดอ้างอิงส่วนหนึ่งของคำตอบของฉันที่คุณอ้างว่าเป็นข้อความที่ไม่ถูกต้องและฉันยินดีที่จะอัปเดต ฉันสมมติว่าเรากำลังใช้ภาษาอังกฤษที่นี่ (ไม่ได้สร้างคำจำกัดความของคำ) และเมื่อผู้คนหลายพันคนค้นหา "ค่าการค้นหาทับทิมในอาร์เรย์" ใน Google พวกเขาเห็นคำถามนี้เป็นผลลัพธ์แรกดังนั้นฉันแน่ใจว่าพวกเขาทุกคนชอบที่จะได้รับคำตอบที่ถูกต้อง
Mike S

1
นอกจากนี้ @MarkThomas หากคุณถูกต้องคำถามนี้ควรถูกปิดเนื่องจากซ้ำกับstackoverflow.com/questions/1986386/…แต่มีความแตกต่างในการทำงานระหว่าง "การค้นหา" และ "การตรวจสอบการมีอยู่" ในอาร์เรย์
Mike S

ฉันแพ้คนที่รื้อฟื้นคำถามเก่า ๆ และให้สารเพียงเล็กน้อยหรือไม่มีเลย สิ่งนี้เกิดขึ้นมากมาย ในกรณีของคุณแม้ว่าจะselectให้ไว้เป็นคำตอบแล้วในปี 2009 แต่คุณได้ให้ข้อมูลโค้ดตัวอย่างซึ่งดีกว่าเล็กน้อย ดังนั้นหลังจากคิดใหม่แล้วฉันก็ถอนสิ่งที่พูดไปก่อนหน้านี้
Mark Thomas

8

ฉันรู้ว่าคำถามนี้ได้รับคำตอบแล้ว แต่ฉันมาที่นี่เพื่อหาวิธีกรององค์ประกอบใน Array ตามเกณฑ์บางอย่าง นี่คือตัวอย่างการแก้ปัญหาของฉัน: โดยใช้selectฉันพบค่าคงที่ทั้งหมดในคลาสที่ขึ้นต้นด้วย "RUBY_"

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

UPDATE:ในระหว่างนี้ฉันได้ค้นพบว่า Array # grep ทำงานได้ดีขึ้นมาก สำหรับตัวอย่างข้างต้น

Class.constants.grep /^RUBY_/

ทำเคล็ดลับ


1
ในระหว่างนี้ฉันได้ค้นพบว่า Array # grep ทำงานได้ดีขึ้นมาก แม้แต่ตัวอย่างข้างต้นClass.constants.grep /^RUBY_/ก็ยังใช้เคล็ดลับ
mydoghasworms


1

คุณสามารถใช้วิธีอาร์เรย์

หากต้องการดูวิธีการอาร์เรย์ทั้งหมดให้ใช้methodsฟังก์ชันกับอาร์เรย์ ตัวอย่างเช่น,

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

คุณสามารถใช้วิธีการอื่นในการตรวจสอบค่าในอาร์เรย์คุณสามารถa.include?("name")ใช้ได้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.