ruby 如何检查二维数组的第一个成员中是否存在值

f0ofjuux  于 2023-10-17  发布在  Ruby
关注(0)|答案(5)|浏览(105)

我试图检查一个二维数组的第一个值是否有我正在测试的值。数组是这样的

[[2,5],[3,1],[4,1]]

我想只检查数组的第一个成员(这里是2或3或4)
我对一维数组做了类似的操作,但对二维数组不起作用

[:cart] << [id, 1] unless [:cart].include?(id)
wydwbb8l

wydwbb8l1#

您可以使用any? Escort函数来实现这一点,如下所示

[:cart] << [id, 1] unless [:cart].any? {|arr| arr[0] == id}
uqzxnwby

uqzxnwby2#

你可以使用assoc来根据第一个值找到一个子数组:

array = [[2, 5], [3, 1], [4, 1]]

array.assoc(3) #=> [3, 1]

同样,它可以用于条件:

array << [id, 1] unless array.assoc(id)

注意assoc必须遍历数组才能找到子数组。如果你的集合很大,哈希可能更合适。

pu82cl6c

pu82cl6c3#

当数据要求嵌套数组的第一个值是唯一的时,嵌套数组可能不是适合您的数据结构。
我建议使用Hash

cart = { 2 => 5, 3 => 1, 4 => 1 }
cart[id] = 1 unless cart.key?(id)

在这种情况下,在嵌套数组上使用哈希的最大好处是,检查特定键是否已经在哈希中更高效(O(1)),而不是迭代数组(O(n))。
当值总是数字而不是像falsenil这样的值时,代码可以进一步简化为(正如mechanicov在评论中指出的那样):

cart = { 2 => 5, 3 => 1, 4 => 1 }
cart[id] ||= 1

cart[id] ||= 1仅在cart[id]尚未返回true值时,才将1分配给由变量id定义的键。

ztigrdn8

ztigrdn84#

您可以将第一个数字提取到一维数组中,并使用当前逻辑。

first_items = arrays.map { |sub_array| sub_array[0] }
ukqbszuj

ukqbszuj5#

pattern matching是什么意思

def add_to_cart_if_absent(cart, id)
  case cart
  in [*, [^id, _], *]
    cart # return same value if match
  else
    cart + [[id, 1]] # return new array with added element
  end
end

*是查找模式的splat运算符
^是pin操作符,用于使用模式中的现有变量
使用_是因为我们不关心第二个元素
id存在时:

cart = [[2, 5], [3, 1], [4, 1]]
id = 3

add_to_cart_if_absent(cart, id)
# => [[2, 5], [3, 1], [4, 1]]

id不存在时:

cart = [[2, 5], [3, 1], [4, 1]]
id = 33

add_to_cart_if_absent(cart, id)
# => [[2, 5], [3, 1], [4, 1], [33, 1]]

相关问题