In 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
上記の例では、要素 "b"が配列 "a"のインデックス1にあるため、出力 "1"が表示されるはずです。
find_index
は単一の要素を取ります。あなたは次のようなことをして最小値を見つけることができます
a = ["a", "b", "c"]
to_find = ["b", "c"]
to_find.map {|i| a.find_index(i) } .compact.min # => 1
ブロックで Array#index
を使用できます。
a = ['a', 'b', 'c']
a.index { |x| ['b', 'c'].include?(x) }
#=> 1
ドキュメントからの引用:
引数の代わりにブロックが指定された場合、ブロックがtrueを返す最初のオブジェクトのインデックスを返します。一致が見つからない場合はnilを返します。
Caryが彼のコメントで指摘したように、a
のすべての要素を['b', 'c']
のすべての要素と比較するのは、最もパフォーマンスの良いアルゴリズムではありません(これはO(n*m)
につながります)。両方の配列のサイズに応じて、より効率的なデータ構造を最初に構築する必要がある場合があります。配列の代わりにSet
を使用すると、set
を前もって作成するのに多少のコストがかかりますが、ブロック内の比較がはるかに高速になります(O(n+m)
全体)。
require 'set'
a = ['a', 'b', 'c']
set = Set.new(['b', 'c'])
a.index { |x| set.include?(x) }
#=> 1
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
も表示できます。
配列b
の配列a
のすべての要素のインデックスを見つけ、配列b
の要素が配列の最初に出現したインデックスを見つけるために最小インデックスを見つけることができます。 a
。
以下のようなもの:
a = ["a", "b", "c"]
b = ["b", "c"]
b.map { |x| a.find_index(x) }.min
#=> 1