【发布时间】:2012-08-14 18:18:53
【问题描述】:
我希望能够在 Ruby 中减去两个哈希并获得第三个哈希。
这两个哈希看起来像这样:
h1 = {"Cat" => 100, "Dog" => 5, "Bird" => 2, "Snake" => 10}
h1.default = 0
h2 = {"cat" => 50, "dog" => 3, "BIRD" => 4, "Mouse" => 75, "Snake" => 10}
h2.default = 0
我希望能够像这样调用 h1 上的方法:
h1.difference(h2)
并得到这个哈希结果:
{"Cat" => 50, "Dog" => 2, "BIRD" => -2, "Mouse" => -75}
我想创建一个新的散列,其中的键来自散列,新散列的值是第一个散列中的键值减去第二个散列中该键的值。问题是,无论键的大小写如何,我都希望这个 Hash 方法能够工作。换句话说,我希望“Cat”与“cat”匹配。
这是我目前所拥有的:
class Hash
def difference(another_hash)
(keys + another_hash.keys).map { |key| key.strip }.uniq.inject(Hash.new(0)) { |acc, key| acc[key] = (self[key] - another_hash[key]); acc }.delete_if { |key, value| value == 0 }
end
end
这没关系,但不幸的是,结果不是我想要的。
任何帮助将不胜感激。
【问题讨论】:
-
在示例中,键名不同的情况示例 Dog in first and dog is second 是错误的还是预期的?
-
这符合预期。我有哈希,其中一个哈希中的大小写可能全部为小写,而另一种哈希中的大小写混合。我希望能够匹配,例如,“狗”与“狗”,或“狗”与“狗”等。
-
如果 h1={"cat" => 1, "Cat" => 2} h2={"cAt" => 3} 会发生什么?
-
对密钥进行预处理以使其标准化是不可能的吗?
-
我没有遇到过这样的案例,所以我没有想到那个。这是个好问题。我认为一种方法是在结果哈希中没有“cat”(或“Cat”或“cAt”),因为h1中的“cat”和“Cat”的值等于h2中的“cAt”的值。