Ruby on rails 如何从值数组中搜索Ruby哈希,然后根据结果返回哈希?

Ruby on rails 如何从值数组中搜索Ruby哈希,然后根据结果返回哈希?,ruby-on-rails,arrays,ruby,hash,Ruby On Rails,Arrays,Ruby,Hash,下面是要在哈希中搜索的示例哈希和示例数组: nicknames = { "Black Mamba" => "Kobe Bryant", "Half Man Half Amazing" => "Vince Carter", "The Big Fundamental" => "Tim Duncan", "Big Ticket" => "Kevin Garnett",

下面是要在哈希中搜索的示例哈希和示例数组:

nicknames = { "Black Mamba" => "Kobe Bryant",
              "Half Man Half Amazing" => "Vince Carter",
              "The Big Fundamental" => "Tim Duncan",
              "Big Ticket" => "Kevin Garnett",
              "Obi-Wan Ginobili" => "Manu Ginobili",
              "The Answer" => "Allen Iverson" }

names = [ "Vince Carter", "Manu Ginobili", "Allen Iverson" ]
我想返回:

selected = { "Half Man Half Amazing" => "Vince Carter", "Obi-Wan Ginobili" => "Manu Ginobili", "The Answer" = "Allen Iverson" }

做这件事的好方法是什么?谢谢

您可以简单地执行以下操作:

nicknames.select { |key, value| names.include?(value) }

(在IRB控制台中复制粘贴您提供的代码和我的代码,您将看到它正在工作)。

您只需执行以下操作:

nicknames.select { |key, value| names.include?(value) }

(复制粘贴您提供的代码并在IRB控制台中进行挖掘,您将看到它正在工作)。

如果散列中的值是唯一的,则可以反转键和值。Yoshiji先生的代码有效,但这里有一个更有效的方法

hash = nicknames.invert
names.to_enum.with_object({}){|k, h| h[hash[k]] = k}

如果散列中的值是唯一的,则可以反转键和值。Yoshiji先生的代码有效,但这里有一个更有效的方法

hash = nicknames.invert
names.to_enum.with_object({}){|k, h| h[hash[k]] = k}

names
是一个数组,为什么我们需要在它上面做
呢?@WandMaker我犯了一个错误。谢谢。想得到名声,是吗?啊哈,我在开玩笑,谢谢你的投入,我不知道这个解决方案更有效+1@Doguita,这在一定程度上取决于反转散列是仅使用一次还是多次使用不同的
名称值。对于一次性使用,构造
散列的设置时间可能不会使此方法比Y先生的方法快。(即使这样,Y也会执行繁重的
名称。包括?(value)
每个
昵称的值,直到找到匹配项。正如我在评论中所指出的,这可以通过使用集合来加快速度。)如果要为
名称的不同值多次构造哈希,那就没有竞争了,由于sawa只需为
名称
的每个元素查找
散列
的值。sawa,我认为这将取决于
包含?
在查找匹配(或确定不存在匹配)之前平均必须走多远,这取决于数据。假设
昵称
名称
大得多,
包含?
将在大部分时间遍历整个数组(并返回
),支持您的结论。
名称
是一个数组,为什么我们需要对其执行
操作?@WandMaker我犯了一个错误。谢谢。想得到名声,是吗?啊哈,我在开玩笑,谢谢你的投入,我不知道这个解决方案更有效+1@Doguita,这在一定程度上取决于反转散列是仅使用一次还是多次使用不同的
名称值。对于一次性使用,构造
散列的设置时间可能不会使此方法比Y先生的方法快。(即使这样,Y也会执行繁重的
名称。包括?(value)
每个
昵称的值,直到找到匹配项。正如我在评论中所指出的,这可以通过使用集合来加快速度。)如果要为
名称的不同值多次构造哈希,那就没有竞争了,由于sawa只需为
名称
的每个元素查找
散列
的值。sawa,我认为这将取决于
包含?
在查找匹配(或确定不存在匹配)之前平均必须走多远,这取决于数据。假设
昵称
姓名
大得多,
包含?
将在大部分时间遍历整个数组(并返回
),支持您的结论。如果所有NBA球员都要包含在
昵称
中,可能:
需要“设置”;snames=名称。要设置;昵称。选择{key,value{snames.include?(value)}
。如果所有NBA球员都要包括在
昵称中,可能:
需要“设置”;snames=名称。要设置;昵称。选择{|键,值| snames。包括?(值)}
。克里斯·卡曼(Chris Kaman)和许多其他有多个昵称的玩家,被称为“穴居人”、“毛茸茸的”、“僵尸”和“疯狂小丑”怎么样?一些更令人难忘的名字:“手枪皮特”(皮特·马拉维奇)、“微波炉”(维尼·约翰逊)、“鸟人”(克里斯·安德森)、“蠕虫”(丹尼斯·罗德曼)、“头发加拿大”(史蒂夫·纳什)、“达·怀特·霍华德”(大卫·李)。@CarySwoveland哈哈,这些绰号也很棒。我想让这个例子简短一些,比如“木瓜”博格斯。在另一端是“鲍勃”(罗伯特·佩蒂特)……克里斯·卡曼(Chris Kaman),被称为“穴居人”、“毛茸茸的”、“僵尸”和“疯狂小丑”,还有许多其他有着多个昵称的玩家呢?一些更令人难忘的名字:“手枪皮特”(皮特·马拉维奇)、“微波炉”(维尼·约翰逊)、“鸟人”(克里斯·安德森)、“蠕虫”(丹尼斯·罗德曼)、“头发加拿大”(史蒂夫·纳什)、“达·怀特·霍华德”(大卫·李)。@CarySwoveland哈哈,这些绰号也很棒。我想让这个例子简短一些,就像“Mugsy”Bogues一样。另一端是“Bob”(罗伯特·佩蒂特)。。。