1

我有一个这样的数组数组:[[1, "dog"], [2, "cat"], [2, "bird"], [3, "monkey"]]. 我想检查较大的数组是否包含给定数量的数组,而不考虑数组的动物元素。我也不想遍历数组,因为这会变得计算量很大。

所以类似于@boolean = bigArray.include?([2, *]),除了实际有效的东西......

4

3 回答 3

4

您有两种可能的解决方案。检测数组中的元素或将数组转换为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
于 2012-09-24T20:06:18.943 回答
0

一种不涉及循环的非常简单的方法是将结构转换为哈希。您的数组恰好是为此的理想格式:

values = [[1, "dog"], [2, "cat"], [2, "bird"], [3, "monkey"]]

Hash[values][2] # "bird"

您将丢失每个键的第一个值,但它将用于显示键是否存在。

于 2012-09-24T20:23:52.650 回答
0

我们可以使用这个:

arr = [[1, "dog"], [2, "cat"], [2, "bird"], [3, "monkey"]]
arr.assoc(2)

它将返回 [2, cat]

如果元素不存在,则在数组中

arr.assoc(10)

返回零

于 2018-09-19T09:31:18.733 回答