提问人:Tikroz 提问时间:8/29/2023 更新时间:8/30/2023 访问量:89
如何检查二维数组的第一个成员中是否存在值
How to check if a value exists in the first member of a two dimensional array
问:
我正在尝试检查二维数组的第一个值是否具有我正在测试的值。数组是这样的
[[2,5],[3,1],[4,1]]
我只想检查数组的第一个成员(这里是 2 或 3 或 4)
我正在为一维数组做这样的事情,但它不适用于二维数组
[:cart] << [id, 1] unless [:cart].include?(id)
答:
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 在评论中指出的那样):false
nil
cart = { 2 => 5, 3 => 1, 4 => 1 }
cart[id] ||= 1
cart[id] ||= 1
仅当尚未返回 true-ish 值时,才分配给变量定义的键。1
id
cart[id]
评论
0赞
mechnicov
8/29/2023
甚至简化。注意:从问题文本转换现有的嵌套数组cart[id] ||= 1
hsh = 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]]
评论
transpose
001 > array = [[2,5],[3,1],[4,1]]
002 > array.transpose.first
=> [2, 3, 4]
arr
x
arr
x
arr = [[1, 6], [2, 7], [3, 8]]; arr.find { |f,_| f == 2 } #=> [2, 7]