web-dev-qa-db-ja.com

In Ruby要素の配列のいずれかのインデックスを見つけるにはどうすればよいですか?

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"が表示されるはずです。

7
user7055375

find_indexは単一の要素を取ります。あなたは次のようなことをして最小値を見つけることができます

a = ["a", "b", "c"]
to_find = ["b", "c"]
to_find.map {|i| a.find_index(i) } .compact.min # => 1
7
Alejandro C.

ブロックで 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
9
spickermann

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
Sebastian Palma

配列bの配列aのすべての要素のインデックスを見つけ、配列bの要素が配列の最初に出現したインデックスを見つけるために最小インデックスを見つけることができます。 a

以下のようなもの:

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

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