我有一个数组:
["a", "b", "c", "d"]
如何计算出在第二个数组中出现的上述数组的第一个元素的索引:
["next", "last", "d", "hello", "a"]
第一个数组中第一个元素在上面的数组中出现的索引是2; " d"属于第一个数组,发生在第2个位置。
答案 0 :(得分:4)
有几种方法可以做到这一点,但天真的方法可能会运作得很好:
tests = ["a", "b", "c", "d"]
in_array = ["next", "last", "d", "hello", "a"]
in_array.each_with_index.find do |e, i|
tests.include?(e)
end
# => ["d", 2]
你可以通过使tests
一个避免大量 O(N)查找的集合来提高速度:
tests = Set.new([ ... ])
相同的代码可以与include?
一起使用,但现在在更长的列表上会更快。
答案 1 :(得分:0)
这种方法包含在一个方法中,返回一个包含两个数组之间所有公共元素索引的数组。
def find_positions(original_array, look_up_array)
positions_array = []
original_array.each do |x|
if look_up_array.index(x) != nil
positions_array << look_up_array.index(x)
end
end
positions_array
# positions_array.first => for the first matched element
end
如果您只想要第一个匹配的元素,则可以返回positions_array.first
,但这样您就不会避免额外的查找。
PS:你也可以使用#collect避免额外的数组(positions_array)
答案 2 :(得分:-1)
您可以遍历要比较的数组,并使用.select或.find迭代器方法。 .find将选择数组中的第一个元素匹配,而.select将匹配数组中的所有元素。如果要在选择中添加索引,可以添加.each_with_index。 &#39;的.index的(a)&#39;如果存在则返回元素,否则返回nil。
alphabet = %w(a b c d)
%w(next last d hello a).each_with_index.find {|a, _index| alphabet.index(a) }
=> ["d", 2]
%w(next last d hello a).each_with_index.select {|a, _index| alphabet.index(a) }[0]
=> ["d", 2]
# if you just need the index of the first match
%w(next last d hello a).index {|a| alphabet.index(a) }
=> 2