如何从另一个数组中的数组中找到任何元素的索引?

时间:2017-03-11 00:44:27

标签: arrays ruby position

我有一个数组:

["a", "b", "c", "d"]

如何计算出在第二个数组中出现的上述数组的第一个元素的索引:

["next", "last", "d", "hello", "a"]

第一个数组中第一个元素在上面的数组中出现的索引是2; " d"属于第一个数组,发生在第2个位置。

3 个答案:

答案 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