在Ruby中如何找到一个元素数组的索引?

时间:2017-05-17 16:40:55

标签: arrays ruby find element

在Ruby 2.4中,如何在另一个数组中找到数组元素的最早索引?也就是说,如果数组的任何元素出现在另一个数组中,我想得到第一个索引。我认为find_index可能会这样做,但是

2.4.0 :004 > a = ["a", "b", "c"]
 => ["a", "b", "c"]
2.4.0 :005 > a.find_index("a")
 => 0
2.4.0 :006 > a.find_index(["b", "c"])
 => nil

在上面的例子中,我希望看到输出“1”,因为元素“b”出现在数组“a”的索引1处。

4 个答案:

答案 0 :(得分:8)

您可以将Array#index与块一起使用。

1.
declare @FILTER_OPTION int
declare @ID_DISTRIBUTOR type_int_value
declare @ID_DATA_TYPE type_bigint_value
declare @ID_AGGREGATION_TYPE type_int_value 

set @FILTER_OPTION = 8
insert into @ID_DISTRIBUTOR values (19)
insert into @ID_DATA_TYPE values (30025)
insert into @ID_AGGREGATION_TYPE values (10)


SELECT * FROM dbo.[DATA] WHERE
[ID_DISTRIBUTOR] IN (select [VALUE] from @ID_DISTRIBUTOR) 
AND [ID_DATA_TYPE] IN (select [VALUE] from @ID_DATA_TYPE) 
AND [ID_AGGREGATION_TYPE] IN (select [VALUE] from @ID_AGGREGATION_TYPE) 

2.
select * FROM dbo.[DATA] WHERE
[ID_DISTRIBUTOR] IN (19)
AND [ID_DATA_TYPE] IN (30025)
AND [ID_AGGREGATION_TYPE] IN (10)

来自文档的引用:

  

如果给出一个块而不是一个参数,则返回该块返回true的第一个对象的索引。如果找不到匹配则返回nil。

正如Cary在他的评论中指出的那样,将a = ['a', 'b', 'c'] a.index { |x| ['b', 'c'].include?(x) } #=> 1 中的所有元素与a中的所有元素进行比较(这将导致['b', 'c'])并不是最高效的算法。根据两个数组的大小,如果可能感觉首先构建更高效的数据结构。使用O(n*m)代替数组在预先创建Set时会有一些成本,但会使块中的比较更快(整体set):

O(n+m)

答案 1 :(得分:4)

find_index只占一个元素。您可以通过执行类似

的操作找到最小值
a = ["a", "b", "c"]
to_find = ["b", "c"]
to_find.map {|i| a.find_index(i) } .compact.min # => 1

答案 2 :(得分:3)

您可以使用find_index并从数组中传递所需的值:

a = ["a", "b", "c"]
p a.find_index('a')
p a.find_index('b')
p a.find_index('c')
# => 0
# => 1
# => 2

您可以使用map获取a数组中的每个元素,然后获取与每个元素对应的索引:

p a.map{|e| a.find_index(e)}
# => [0, 1, 2]

处理它的另一种可能方法是使用Enumerable#each_with_index

a.each_with_index{|e,i| puts "Element: #{e}, Index: #{i}"}
# => Element: a, Index: 0
# => Element: b, Index: 1
# => Element: c, Index: 2

如果要使用["b", "c"]数组检查["a", "b", "c"]中每个元素的索引,可以映射第一个,获取数组值,然后使用a,b,c检查那些索引:

p ["b", "c"].map{|e| ["a", "b", "c"].find_index(e) }
# => [1, 2]

您还可以看到Array#indexEnumerable#find_index

答案 3 :(得分:0)

您可以在数组b中找到数组a的所有元素的索引,并找到min索引以查找数组b中的元素首先出现在数组中的索引a

如下所示:

a = ["a", "b", "c"]
b = ["b", "c"]

b.map { |x| a.find_index(x) }.min
#=> 1