Знайдіть значення в масиві


124

Як я можу знайти значення в масиві в Ruby?


Вибачте за такий тип запитань, я тут новачок, і я вчусь користуватися цим інструментом, спробую знайти відповіді перед публікацією тут.
Лукас Ренан

107
Для всіх, хто скаржиться на подібне запитання: будь ласка, прочитайте FAQ: "Жодне питання не надто тривіальне чи занадто" новачок "". Якщо вам не подобається питання, не відповідайте на нього, і дозвольте це зробити хтось інший. Якщо на запитання вже задали відповідь та відповіли на нього, тоді обов'язково позначте його як дублікат. Але немає ніяких причин лаяти прибульців за те, що вони нові.
Брайан Кемпбелл

Відповіді:


117

Я здогадуюсь, що ви намагаєтеся знайти, чи існує певне значення всередині масиву, і якщо це так, ви можете використовувати Array # include? (Value):

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

Якщо ви маєте на увазі щось інше, перевірте API Ruby Array


1
Я б використав індекс Array #, але перевірка API Ruby Array - чудова порада.
Віллім Джадд

82

Використання 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саме це я шукав.
Джастін Адкінс

1
array.select{}буде проходити всі елементи в масиві, шукаючи ті, які відповідають умові. array.findнатомість поверне перший елемент, який відповідає умові. Тож переважніше використання array.find{ |e| e == 3 }тодіarray.select{ |e| e == 3 }.first
Оскар Гонсалес

Я думаю, ти мав на увазі, що .find_index я не знаю, чи є такий.find
Росс Attrill

26

Якщо ви хочете знайти одне значення з масиву, використовуйте 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

Щоб дізнатись, чи існує значення в масиві, ви також можете використовувати #in?під час використання ActiveSupport. #in?працює для будь-якого об'єкта, який відповідає #include?:

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

Я не бачу жодної Array#findу посиланнях на Ruby. Це повинно бути річкою, оскільки інші люди згадували про це.
Гммм

1
@Ross Attrill Ні, це в Enumerable, ruby-doc.org/core-2.7.1/Enumerable.html#method-i-find
fangxing

Я неправильно припустив, що шоу ruby-doc включає в себе і успадковані методи. Важливе заняття для мене.
Росс 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, вони бачать це питання як перший результат, тому я впевнений, що всі вони хотіли б насправді отримати правильну відповідь.
Майк S

1
Крім того, @MarkThomas, якщо ви були правильні, тоді це питання слід закрити, оскільки він є дублікатом stackoverflow.com/questions/1986386/… , але є "функціональна різниця між" знаходженням "та" перевіркою на наявність "у масиві.
Майк S

У мене алергія на людей, які задають старі питання і надають мало нічого іншого. Це трапляється багато. У вашому випадку, хоча selectце вже було надано як відповідь у 2009 році, ви навели фрагмент зразка, який трохи краще. Отож, переосмисливши це, я відкликаю те, що говорив раніше.
Марк Томас

8

Я знаю, що на це питання вже відповіли, але я прийшов сюди, шукаючи спосіб фільтрувати елементи в масиві на основі деяких критеріїв. Тож ось мій приклад рішення: використовуючи select, я знаходжу всі константи класу, які починаються з "RUBY_"

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

ОНОВЛЕННЯ: Тим часом я виявив, що Array # grep працює набагато краще. Для наведеного вище прикладу,

Class.constants.grep /^RUBY_/

зробив трюк.


1
Тим часом я виявив, що Array # grep працює набагато краще. Навіть для наведеного вище прикладу Class.constants.grep /^RUBY_/зробив трюк.
mydoghasworms


1

Можна перейти до методів масиву.

Щоб побачити всі методи масиву, використовуйте methodsфункцію з масивом. Наприклад,

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

До речі, ви можете використовувати інший метод для перевірки значення в масиві, який ви можете використовувати a.include?("name").

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.