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

How to check if a value exists in the first member of a two dimensional array

提问人:Tikroz 提问时间:8/29/2023 更新时间:8/30/2023 访问量:89

问:

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

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

我只想检查数组的第一个成员(这里是 2 或 3 或 4)

我正在为一维数组做这样的事情,但它不适用于二维数组

[:cart] << [id, 1] unless [:cart].include?(id)
阵列 Ruby-on-Rails Ruby 多维数组

评论

0赞 Allacassar 8/29/2023
您可以使用 .transpose001 > array = [[2,5],[3,1],[4,1]] 002 > array.transpose.first => [2, 3, 4]
0赞 Cary Swoveland 8/30/2023
你的意思是,给定一个数组,其元素是大小为 2 的数组和一个值,您希望确定任何元素的第一个元素是否相等?(要准确!如果是这样,最简单的可能是最好的:,它会产生一个真实(如本例中所示)或虚假的值。请注意,在 Ruby 中,通常不会提到“n 维数组”。arrxarrxarr = [[1, 6], [2, 7], [3, 8]]; arr.find { |f,_| f == 2 } #=> [2, 7]

答:

1赞 oldmanowl 8/29/2023 #1

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

first_items = arrays.map { |sub_array| sub_array[0] }
4赞 Mohsin Sethi 8/29/2023 #2

你可以用任何吗?可枚举函数来实现此目的,如下所示

[:cart] << [id, 1] unless [:cart].any? {|arr| arr[0] == id}
4赞 spickermann 8/29/2023 #3

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

我建议改用哈希

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

在这种情况下,在嵌套数组上使用哈希的最大好处是,检查特定键是否已经在哈希中,性能更高 (),而不是遍历数组(这将是 )。O(1)O(n)

当值始终是数字而不是像 or 这样的值时,代码可以进一步简化为(正如 mechanicov 在评论中指出的那样):falsenil

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

cart[id] ||= 1仅当尚未返回 true-ish 值时,才分配给变量定义的键。1idcart[id]

评论

0赞 mechnicov 8/29/2023
甚至简化。注意:从问题文本转换现有的嵌套数组cart[id] ||= 1hsh = ary.to_h
0赞 spickermann 8/30/2023
@mechnicov 好主意!我更新了我的答案以解决您的评论。
1赞 Cary Swoveland 8/30/2023
我想我注意到的时间晚了,但恭喜你突破了 10^6。
0赞 spickermann 8/30/2023
@CarySwoveland 谢谢你,你实际上是第一个注意到......
4赞 Stefan 8/29/2023 #4

您可以使用 assoc 根据子数组的第一个值查找子数组:

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

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

同样,它可以在条件中使用:

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

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

0赞 mechnicov 8/29/2023 #5

模式匹配是怎么回事

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 运算符

^是引脚运算符,用于使用模式中的现有变量

_之所以使用,是因为我们不关心第二个元素

何时存在: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]]