0

我从 Rails 文档中得到这个:

{1 => 2}.diff(1 => 2)         # => {}
{1 => 2}.diff(1 => 3)         # => {1 => 2}
{}.diff(1 => 2)               # => {1 => 2}
{1 => 2, 3 => 4}.diff(1 => 2) # => {3 => 4}

这几乎是完美的,但我不希望散列中的值作为参数传递,而不是调用散列中。

我想要的是:

{}.diff(1 => 2) # => {}
{a: 1}.diff({a: 1, b: 2}) # => {} instead of {:b => 2}

此外,它必须尽可能高效。例如,我不想检查第二个散列并检查内部的每个键是否没有出现在第一个散列中。

有任何想法吗?

4

2 回答 2

2

在这里查看源代码很有帮助。

def diff(h2)
  dup.delete_if { |k, v| h2[k] == v }.merge!(h2.dup.delete_if { |k, v| has_key?(k) })
end

它遍历哈希中的每个条目。我假设您不想添加不必要的迭代。所以比上面的容易

def my_diff(h2)
  dup.delete_if { |k, v| h2[k] == v }
end
于 2013-06-29T15:57:54.113 回答
1

这很容易:

a.select {|k, v| b.key?(k) && b[k] != v }

这是 O(n),因为两者key?Hash#[]都是 O(1)。

于 2013-06-29T15:58:35.550 回答