当前位置: 首页 > 知识库问答 >
问题:

将哈希数组合并为一个数组,然后根据匹配的 id 对所有哈希进行分组

鲍宁
2023-03-14

我有几个数组(我们称它们为“原始数组”)。每个数组都包含哈希值,在每个哈希值中,我都有来自收到的电子邮件的数据。例如电子邮件地址、姓名等。我还有一个 uid,这是收到的电子邮件上的唯一标识符。原始数组之间会有很多重复,数组的共同点越多越好(在理想情况下,它们应该包含相同的电子邮件和相同的电子邮件数据)。

输入样本:

[[{:from_address=>"one@example.com",
   :to=>"one@example.com",
   :subject=>"Some subject regarding order 12198",
   :datetime=>Sat, 27 Jul 2013 08:48:44 +0000,
   :uid=>15065,
   :extraction_strategy=>1,
   :result=>{:order_id=>"12198", :mail_address=>nil, :name=>"Dr. Evil"}},
  {:from_address=>"one@example.com",
   :to=>"one@example.com",
   :subject=>"Some subject regarding order 12199",
   :datetime=>Sat, 27 Jul 2013 08:48:48 +0000,
   :uid=>15066,
   :extraction_strategy=>1,
   :result=>{:order_id=>"12199", :mail_address=>nil, :name=>nil}}],
 [{:from_address=>"one@example.com",
   :to=>"one@example.com",
   :subject=>"Some subject regarding order 12197",
   :datetime=>Sat, 27 Jul 2013 08:22:48 +0000,
   :uid=>15064,
   :extraction_strategy=>2,
   :result=>{:order_id=>"12197", :mail_address=>"three@example.com", :name=>"Batman"}},
  {:from_address=>"one@example.com",
   :to=>"one@example.com",
   :subject=>"Some subject regarding order 12199",
   :datetime=>Sat, 27 Jul 2013 08:48:48 +0000,
   :uid=>15066,
   :extraction_strategy=>2,
   :result=>{:order_id=>"12199", :mail_address=>"two@example.com", :name=>"James Bond"}}]]

我现在想对所有这些进行重新排序,以便得到一个新数组(我们称之为“一级数组”)。在第一级数组中,我想要“第二级数组”,每个数组都包含具有匹配 uid 的电子邮件。因此,如果来自其中一个原始数组的电子邮件与其他原始数组之一中的电子邮件具有相同的 uid,则这两封电子邮件应放入相同的新第二级数组中。

输出样本:

   [[
    [{:from_address=>"one@example.com",
      :to=>"one@example.com",
      :subject=>"Some subject regarding order 12197",
      :datetime=>Sat, 27 Jul 2013 08:22:48 +0000,
      :uid=>15064,
      :extraction_strategy=>2,
      :result=>{:order_id=>"12197", :mail_address=>"three@example.com", :name=>"Batman"}}],
    [{:from_address=>"one@example.com",
      :to=>"one@example.com",
      :subject=>"Some subject regarding order 12198",
      :datetime=>Sat, 27 Jul 2013 08:48:44 +0000,
      :uid=>15065,
      :extraction_strategy=>1,
      :result=>{:order_id=>"12198", :mail_address=>nil, :name=>"Dr. Evil"}}],
    [{:from_address=>"one@example.com",
      :to=>"one@example.com",
      :subject=>"Some subject regarding order 12199",
      :datetime=>Sat, 27 Jul 2013 08:48:48 +0000,
      :uid=>15066,
      :extraction_strategy=>1,
      :result=>{:order_id=>"12199", :mail_address=>"two@example.com", :name=>"James Bond"}},
     {:from_address=>"one@example.com",
      :to=>"one@example.com",
      :subject=>"Some subject regarding order 12199",
      :datetime=>Sat, 27 Jul 2013 08:48:48 +0000,
      :uid=>15066,
      :extraction_strategy=>2,
      :result=>{:order_id=>"12199", :mail_address=>nil, :name=>nil}}]
   ]]

我只能提出需要大量循环和重复的解决方案,但由于数组可能会变得非常大,因此我需要一个高效简洁的例程。谁能帮我?

共有1个答案

羊舌琛
2023-03-14

嗯,两个嵌套循环和一张地图…

a = [[{:from_address=>"one@example.com",
       :to=>"one@example.com",
       :subject=>"Some subject regarding order 12198",
       :datetime=>"Sat, 27 Jul 2013 08:48:44 +0000",
       :uid=>15065,
       :extraction_strategy=>1,
       :result=>{:order_id=>"12198", :mail_address=>nil, :name=>"Dr. Evil"}},
      {:from_address=>"one@example.com",
       :to=>"one@example.com",
       :subject=>"Some subject regarding order 12199",
       :datetime=>"Sat, 27 Jul 2013 08:48:48 +0000",
       :uid=>15066,
       :extraction_strategy=>1,
       :result=>{:order_id=>"12199", :mail_address=>nil, :name=>nil}}],
     [{:from_address=>"one@example.com",
       :to=>"one@example.com",
       :subject=>"Some subject regarding order 12197",
       :datetime=>"Sat, 27 Jul 2013 08:22:48 +0000",
       :uid=>15064,
       :extraction_strategy=>2,
       :result=>{:order_id=>"12197", :mail_address=>"three@example.com", :name=>"Batman"}},
      {:from_address=>"one@example.com",
       :to=>"one@example.com",
       :subject=>"Some subject regarding order 12199",
       :datetime=>"Sat, 27 Jul 2013 08:48:48 +0000",
       :uid=>15066,
       :extraction_strategy=>2,
       :result=>{:order_id=>"12199", :mail_address=>"two@example.com", :name=>"James Bond"}}]]

       result  = Hash.new {|h,k| h[k] = [] }
       a.each { |b| b.each { |h| result[h[:uid]] << h } }
       result = result.map { |k, v| v }

...但是请注意,为了让它工作,我必须将日期时间字段更改为字符串。比我聪明的人也许能想出如何绕过它。

 类似资料:
  • 所以,我有一个带有数组的哈希,就像这样: 我想将它们合并到一个哈希数组中,组合相应的元素。 结果应该是这样的: 知道如何有效地做到这一点吗? 请注意,真实世界的使用场景可能包含数量可变的散列键。

  • 寻找一种优雅的方式以特殊的方式合并两个散列数组: 如果名称关键字匹配,则结果必须包含< code>new_data的所有名称散列,仅包含< code>old_data的额外数据。 我的第一次尝试是这样的,但是它创建了一个额外的散列:

  • 我有两个哈希数组: 我想在< code>a2中找到其< code>ID和< code>name字段与< code>a1中条目的< code>ID和< code>name字段相匹配的散列(不考虑< code>email或任何其他进入< code>a2的项目),然后将< code>ORDER_NO的值合并到< code>a1散列中也就是说,以下列方式结束: 我也想忽略 a2 中存在的元素,但不忽略 a

  • 我有 2 个数组: 我希望array1元素成为新Hash中的键,array2元素成为同一个Hash中相应的值。有人能建议一下怎么做吗? 谢谢

  • 问题内容: 我有一个实现了hashCode()的向量类。它不是我写的,而是使用2个质数对2个向量分量进行异或运算。这里是: …因为这是来自已建立的Java库,所以我知道它可以正常工作。 然后,我有一个Boundary类,其中包含2个向量:“开始”和“结束”(代表直线的端点)。这两个向量的值是边界的特征。 在这里,我尝试为构成该边界的向量的唯一2元组(起点和终点)创建一个良好的hashCode()。

  • 我想将两个哈希数组合并到一个新数组中: 现在这就是我正在寻找的结果: 我在Ruby文档中唯一能找到的合并选项是用另一个散列覆盖重复项。那么如何才能达到我需要的版本呢?