在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处。
答案 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#index
和Enumerable#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