查找哈希与哈希数组的部分匹配

Posted

技术标签:

【中文标题】查找哈希与哈希数组的部分匹配【英文标题】:Find partial match of hash against array of hashes 【发布时间】:2018-06-14 17:21:44 【问题描述】:

我有一个要匹配的哈希数组。

me = [paid: true, setup: true, send_to: "somewhere",
     paid: true, setup: false, send_to: "somewhere else",
     paid: false, setup: true, send_to: "somewhere new",
     paid: false, setup: false, send_to: "somewhere outside"]

我有一个只有 2 个键/值对的哈希:

went = paid: true, setup: false

我想要做的是将wentme 进行比较,如果匹配则返回send_to 中的值

几乎像 include? 但这不起作用,因为我的 went 哈希只有 2 个键/值对..

【问题讨论】:

【参考方案1】:

这样的吗?

me.find  |item| item[:paid] == went[:paid] && item[:setup] == went[:setup] &.fetch(:send_to)

或者这个

me.find  |item| item.values_at(:paid, :setup) == went.values_at(:paid, :setup) &.fetch(:send_to)

【讨论】:

我的荣幸先生 :)【参考方案2】:

无需硬编码密钥的方法:

me.find  |item| went <= item &.fetch(:send_to)

me.find  |item| item >= went &.fetch(:send_to)

me.find(&went.method(:<=))&.fetch(:send_to)

me.find  |item| item.values_at(*went.keys) == went.values &.fetch(:send_to)

me.find  |item| went.to_a & item.to_a == went.to_a &.fetch(:send_to)

me.find  |item| item.merge(went) == item &.fetch(:send_to)

我最喜欢前两个。最后一个来自this page,它显示了子集/超集运算符的一些历史。

【讨论】:

【参考方案3】:
me.find  |h| h == h.merge(went) &.[](:send_to)
  #=> "somewhere else"
me.find  |h| h == h.merge(:paid=>true, :setup=>"cat") &.[](:send_to)
  #=> nil

【讨论】:

你忘记了第二部分。而且啊,现在我正在考虑切换回“h”......我从那个切换到“item”以便与其他答案进行比较:-) 谢谢@Stefan。我修好了。

以上是关于查找哈希与哈希数组的部分匹配的主要内容,如果未能解决你的问题,请参考以下文章

数据结构:哈希表(根据数值查找的key-value容器)

蓝书《哈希与哈希表》——知识整理

如何在 Perl 中获取哈希的一部分?

java数据结构——哈希表(HashTable)

查找算法--Hash search--哈希查找

九. 常用类库向量与哈希6.哈希表及其应用