在数组中寻找价值


124

在Ruby中,如何找到数组中的值?


抱歉,我是此处的新手,我正在学习使用此工具,在发布之前,我将尝试查找答案。
卢卡斯·雷南

107
对于所有抱怨此类问题的人:请阅读FAQ:“没有问题太琐碎或太“新手”。如果您不喜欢这个问题,请不要回答,然后让其他人回答。如果已经通过SO提出并回答了该问题,请确保将其标记为重复。但是没有理由指责新来者是新来的。
布赖恩·坎贝尔

Answers:


117

我猜您正在尝试查找数组中是否存在某个值,如果是这种情况,则可以使用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是一个很好的技巧。
威廉·贾德

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
Ross Attrill

25

如果要从数组中找到一个值,请使用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参考中看不到任何内容。既然别人已经提到过,那一定是Rails的事情。嗯....
罗斯·阿特里尔

1
@Ross Attrill否,位于Enumerableruby-doc.org/core
方兴

我错误地认为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"

这将返回所需元素的索引,如果数组不包含该值,则返回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中搜索“数组中的红宝石FIND值”时,他们将这个问题视为第一个结果,因此,我敢肯定,他们都会喜欢得到正确的答案。
Mike S

1
此外,@ MarkThomas(如果您是正确的)则应关闭该问题,因为它是stackoverflow.com/questions/1986386/…的重复项,但是数组中“查找”和“检查是否存在”之间存在功能差异。
Mike S

我对那些重提旧问题并且几乎没有提供任何实质内容的人们过敏。这经常发生。就您而言,尽管select在2009年已经提供了答案,但您确实提供了一个示例片段,它要好一些。因此,在重新考虑之后,我撤回了我先前所说的内容。
马克·托马斯

8

我知道这个问题已经得到了回答,但是我来到这里是在寻找一种基于某些条件过滤数组中元素的方法。所以这是我的解决方案示例:使用select,我发现Class中所有以“ 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")

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.