Ruby 数组中的差异(包括重复项)

osm*_*man 4 ruby

[1,2,3,3] - [1,2,3]产生空数组[]。是否可以保留重复项以便返回[3]

Car*_*and 5

我很高兴你问了。我希望Array在 Ruby 的未来版本中看到这样的方法添加到类中,因为我发现它有很多用途:

class Array
  def difference(other)
    h = other.each_with_object(Hash.new(0)) { |e,h| h[e] += 1 }
    reject { |e| h[e] > 0 && h[e] -= 1 }
  end
end
Run Code Online (Sandbox Code Playgroud)

这里给出了该方法的描述及其一些应用程序的链接。

举例来说:

a = [1,2,3,4,3,2,4,2]
b = [2,3,4,4,4]

a - b          #=> [1]
a.difference b #=> [1,2,3,2]
Run Code Online (Sandbox Code Playgroud)

Ruby v2.7 为我们提供了方法Enumerable#tally,允许我们将方法的第一行替换为

h = other.tally
Run Code Online (Sandbox Code Playgroud)