我有一个这样的数组数组:[[1, "dog"], [2, "cat"], [2, "bird"], [3, "monkey"]]
. 我想检查较大的数组是否包含给定数量的数组,而不考虑数组的动物元素。我也不想遍历数组,因为这会变得计算量很大。
所以类似于@boolean = bigArray.include?([2, *])
,除了实际有效的东西......
我有一个这样的数组数组:[[1, "dog"], [2, "cat"], [2, "bird"], [3, "monkey"]]
. 我想检查较大的数组是否包含给定数量的数组,而不考虑数组的动物元素。我也不想遍历数组,因为这会变得计算量很大。
所以类似于@boolean = bigArray.include?([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.如果你不关心碰撞键,你可以将数组转换为a 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
一种不涉及循环的非常简单的方法是将结构转换为哈希。您的数组恰好是为此的理想格式:
values = [[1, "dog"], [2, "cat"], [2, "bird"], [3, "monkey"]]
Hash[values][2] # "bird"
您将丢失每个键的第一个值,但它将用于显示键是否存在。
我们可以使用这个:
arr = [[1, "dog"], [2, "cat"], [2, "bird"], [3, "monkey"]]
arr.assoc(2)
它将返回 [2, cat]
如果元素不存在,则在数组中
arr.assoc(10)
返回零