gpt4 book ai didi

arrays - 迭代散列,并取值直到达到某个总和限制

转载 作者:太空宇宙 更新时间:2023-11-03 18:05:46 25 4
gpt4 key购买 nike

我有两个哈希数组,看起来像这样:

h1=[{id:1, item:1, value:10},
{id:1, item:2, value:3}]

h2=[{id:1, item_a:1, value:5},{id:2, item_a:1, value:7},{id:3, item_a:1, value:10},
{id:4, item_b:2, value:1},{id:5, item_b:2, value:2},{id:6, item_b:2, value:5},
{id:7, item_b:2, value:1}]

我需要遍历 h2 和:

  1. 对于每个 h1 哈希,找到一个 h2 哈希,其 item 对应于 item_a,例如,item 值为1item_a 值为1,
  2. 从散列h2中取,直到所取项的总和等于或大于h1散列值中的项,
  3. h1h2 创建一个 id 数组,其第一个值为 h1id 和第二个值是 h2 中的 id

在我上面的示例中,结果将是 [[1,1],[1,2],[1,4],[1,5]]

我找到了 this answer然而,在这里,它只是将值相加到某个定义的限制。在达到某些总和之前,我不知道如何取值。我希望有人能给我指明方向。

更新

结果 [[1,1],[1,2],[1,4],[1,5]] 是因为:

  1. h1 中我们获取第一个哈希值,其中 item:1value:10,所以我们需要从 h2 中收集 id 其中 item_a:1 因为我需要 11 值(在现实生活中 - ids)并且我们的总值应该是至少 10
  2. 我们遍历 h2 并从第一个散列开始 - 它的 value:5 小于 10 所以我们接受它然后继续到下一个散列 - 它的 value:7 如果我们将它与之前的 5 相加,我们得到 12 - 它大于 10 所以我们接受它并停止迭代,因为我们不允许再接受任何项目。我们第一次迭代的结果是:h1 散列的 id 是 1h2 散列的 id 是 12。所以到目前为止我们的数组是 [[1,1],[1,2]]
  3. 我们对来自 h1 的第二个哈希执行相同的操作,其中来自 h2 的匹配 ids4 并且5

更新 2

我正在清除我的示例,因为两个哈希中都可以简单地包含 item。我想扩展一下我的例子。

如果在 h1 中添加额外条件 from-to 日期范围和 date 条件,代码将如何更改> 和 h2?

h1=[{id:1, item:1, from: DateTime.new(2017,9,4,6,0,0,'+0300'), to: DateTime.new(2017,9,4,17,59,59,'+0300'), value:10},
{id:1, item:2, from: DateTime.new(2017,9,4,18,0,0,'+0300'), to: DateTime.new(2017,9,4,23,59,59,'+0300'), value:10}]

h2=[{id:1, item:1, date: DateTime.new(2017,9,4,6,10,0,'+0300'), value:5},
{id:2, item:1, date: DateTime.new(2017,9,4,7,20,0,'+0300'), value:7},
{id:3, item:1, date: DateTime.new(2017,9,4,8,05,0,'+0300'), value:10},
{id:4, item:2, date: DateTime.new(2017,9,4,18,19,10,'+0300'), value:1},
{id:5, item:2, date: DateTime.new(2017,9,4,19,20,0,'+0300'), value:2},
{id:6, item:2, date: DateTime.new(2017,9,4,22,22,0,'+0300'), value:5},
{id:7, item:2, date: DateTime.new(2017,9,4,23,0,0,'+0300'), value:1}]

我只想从 h2datefrom 的 h1 日期范围内的那些散列中获取 ID - 。我想我应该把这个 h2[:date].between?(h1[:from], h1[:to]) 放在某个地方。

最佳答案

首先我做了几个假设,你在你的描述中根本没有提到 item_b,只声明 h1 之间的链接>h2 是关键 item_a,所以我假设 item_aitem_b 是等价的...即,你赢了没有像 item_b: 1 这样的东西,你不想考虑 h1 中的第一个散列只是因为它是 item_b 而不是 项目_a。如果这不正确,您需要相应地调整下面的代码(应该不会太难)。


首先,如果您将 h2 中的项目按它们的 item_a/item_b 键分组,这样您就可以简单地查找它们:

h2 = h2.group_by { |item| item[:item_a] || item[:item_b] }
# => {1=>[ {:id=>1, :item_a=>1, :value=>5},
{:id=>2, :item_a=>1, :value=>7},
{:id=>3, :item_a=>1, :value=>10} ],
2=>[ {:id=>4, :item_b=>2, :value=>1},
{:id=>5, :item_b=>2, :value=>2},
{:id=>6, :item_b=>2, :value=>5},
{:id=>7, :item_b=>2, :value=>1} ]
}

现在,h2[1] 拥有映射到 h1 第一行的所有项目(基于 item 键)。接下来,您希望将 h1 中的值映射到一个数组列表中,其中包含 h1 中的 idid h2h2id 来自 take_while 循环,跟踪总和:

results = h1.map do |base|
sum = 0

h2[base[:item]].take_while do |item|
sum += item[:value] if sum < base[:value]
end.map do |item|
[base[:id], item[:id]]
end
end

# => [[[1, 1], [1, 2]], [[1, 4], [1, 5]]]

最后,您需要展平 1 级以获得您想要的结果:

puts results.flatten(1).inspect
# => [[1, 1], [1, 2], [1, 4], [1, 5]]

关于arrays - 迭代散列,并取值直到达到某个总和限制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46238455/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com