Найти значение в массиве

124

Как в Ruby найти значение в массиве?

Лукас Ренан
источник
Извините за вопросы такого типа, я здесь новичок, и я учусь использовать этот инструмент, я постараюсь найти ответы, прежде чем размещать здесь.
Лукас Ренан,
107
Всем, кто жалуется на подобные вопросы: прочтите FAQ: «Нет вопросов слишком тривиальных или слишком новичков». Если вам не нравится вопрос, не отвечайте на него, пусть это сделает кто-то другой. Если вопрос уже был задан и дан ответ на SO, то обязательно отметьте его как дубликат. Но нет причин ругать новичков за то, что они новички.
Брайан Кэмпбелл,

Ответы:

118

Я предполагаю, что вы пытаетесь определить, существует ли определенное значение внутри массива, и в этом случае вы можете использовать Array # include? (Value):

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

Если вы имеете в виду что-то еще, проверьте Ruby Array API

Марк Вестлинг
источник
1
Я бы использовал Array # index, но проверка Ruby Array API - отличный совет.
Уиллиам Джадд
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это именно то, что я искал.
Джастин Адкинс,
1
array.select{}пройдется по всем элементам в массиве в поисках тех, которые соответствуют условию. array.findвместо этого вернет первый элемент, соответствующий условию. Так что предпочтительнее использовать array.find{ |e| e == 3 }тогдаarray.select{ |e| e == 3 }.first
Оскар Гонсалес
Думаю, вы имели в виду, что .find_index я не знаю, есть ли они.find
Росс Аттрилл,
28

Если вы хотите найти одно значение из массива, используйте 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
Fangxing
источник
Я не вижу ничего Array#findв ссылках на Ruby. Должно быть, это связано с Rails, раз уж об этом упоминали другие люди. Хммм ....
Росс Аттрилл
1
@Ross Attrill Нет, это в Enumerable, ruby-doc.org/core-2.7.1/Enumerable.html#method-i-find
Fangxing
Я ошибочно предположил, что ruby-doc показывает включенные и унаследованные методы. Важный урок для меня.
Росс Аттрилл,
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"

Это вернет вам индекс нужного элемента или nil, если ваш массив не содержит значения.

Вим Холлебрандс
источник
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 году, вы предоставили образец фрагмента, который немного лучше. Поэтому, переосмыслив это, я отказываюсь от того, что сказал ранее.
Марк Томас
8

Я знаю, что на этот вопрос уже был дан ответ, но я пришел сюда в поисках способа фильтрации элементов в массиве на основе некоторых критериев. Итак, вот мой пример решения: используя select, я нахожу все константы в классе, которые начинаются с «RUBY_»

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

ОБНОВЛЕНИЕ: Тем временем я обнаружил, что Array # grep работает намного лучше. В приведенном выше примере

Class.constants.grep /^RUBY_/

сделали свое дело.

mydoghasworms
источник
1
Тем временем я обнаружил, что Array # grep работает намного лучше. Даже для приведенного выше примера Class.constants.grep /^RUBY_/сработало.
mydoghasworms
1

Спасибо за ответы.

Мне понравилось вот что:

puts 'find' if array.include?(value)
Лукас Ренан
источник
1

Вы можете использовать методы массива.

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

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

Кстати, вы можете использовать другой метод для проверки значения в массиве. Вы можете использовать a.include?("name").

Форам Такрал
источник