次のような配列の配列があります[[1, "dog"], [2, "cat"], [2, "bird"], [3, "monkey"]]
。配列の動物要素に関係なく、より大きな配列に特定の数の配列が含まれているかどうかを確認したいと思います。また、計算が重くなるため、配列をループ処理したくありません。
@boolean = bigArray.include?([2, *])
実際に機能するものを除いて、のようなもの...
次のような配列の配列があります[[1, "dog"], [2, "cat"], [2, "bird"], [3, "monkey"]]
。配列の動物要素に関係なく、より大きな配列に特定の数の配列が含まれているかどうかを確認したいと思います。また、計算が重くなるため、配列をループ処理したくありません。
@boolean = bigArray.include?([2, *])
実際に機能するものを除いて、のようなもの...
考えられる解決策は 2 つあります。配列内の要素を検出するか、配列をHash
1. Enumerable#detectを使用します。一致が見つかるとすぐに停止し、それ以外の場合はそれを返しnil
ます。
> a = [[1, "dog"], [2, "cat"], [2, "bird"], [3, "monkey"]]
=> [[1, "dog"], [2, "cat"], [2, "bird"], [3, "monkey"]]
> a.detect{ |(n, _)| n == 2 }
=> [2, "cat"]
> a.detect{ |(n, _)| n == 10 }
=> nil
これをArray
例のようにクラスに追加し、強制的にブール値を返すようにする場合は、次のようにします。
class Array
def custom_include?(num)
!!detect{ |(n, _)| num == n }
end
end
例:
> a.custom_include?(2)
=> true
> a.custom_include?(10)
=> false
2.キーの衝突を気にしない場合は、配列を に変換してHash
、キーが存在するかどうかを確認できます。
> a = [[1, "dog"], [2, "cat"], [2, "bird"], [3, "monkey"]]
=> [[1, "dog"], [2, "cat"], [2, "bird"], [3, "monkey"]]
> Hash[a][2]
=> "bird"
> Hash[a][10]
=> nil
ループを伴わない非常に簡単な方法の 1 つは、構造体をハッシュに変換することです。あなたの配列はたまたまこれに理想的な形式になっています:
values = [[1, "dog"], [2, "cat"], [2, "bird"], [3, "monkey"]]
Hash[values][2] # "bird"
各キーの最初の値は失われますが、キーが存在するかどうかを示すのに役立ちます。