arrays - Ruby 中保留重复元素的数组之间的区别

标签 arrays ruby difference

我是 Ruby 的新手,希望弄清楚两个数组之间的区别。

我知道通常的方法:

a = [...]
b = [...]
difference = (a-b)+(b-a)

但问题在于这是在计算集合差,因为在 ruby​​ 中,语句 (a-b) 定义了 a 相对于 b 的集合补码。

这意味着 [1,2,2,3,4,5,5,5,5] - [5] = [1,2,2,3,4] ,因为它去掉了第一组中出现的所有 5,而不仅仅是一个,就像数据过滤器一样。

我希望它只删除一次差异,例如,[1,2,2,3,4,5,5,5,5] 的差异[5] 应该是 [1,2,2,3,4,5,5,5],只删除一个 5。

我可以迭代地这样做:

a = [...]
b = [...]

complimentAbyB = a.dup
complimentBbyA = b.dup

b.each do |bValue|
  complimentAbyB.delete_at(complimentAbyB.index(bValue) || complimentAbyB.length)
end
a.each do |aValue|
  complimentBbyA.delete_at(complimentBbyA.index(aValue) || complimentBbyA.length)
end

difference = complimentAbyB + complimentBbyA

但这看起来非常冗长且效率低下。我不得不想象有比这更优雅的解决方案。所以我的问题基本上是,找到两个数组差异的最优雅方法是什么,如果一个数组中单个元素的出现次数多于另一个数组,它们将不会全部被删除?

最佳答案

我最近提出了这样一种方法,Ruby#difference , 被添加到 Ruby 的核心。对于你的例子,它会被写成:

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

a.difference b
  #=> [1,2,2,3,4,5,5,5]

我经常举的例子是:

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

a.difference b
  #=> [1, 3, 2, 2] 

我首先在我的回答中建议了这个方法 here .在那里你会找到我建议使用该方法的其他 SO 问题的解释和链接。

如链接所示,方法可以这样写:

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

关于arrays - Ruby 中保留重复元素的数组之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34347203/

相关文章:

java - 二维数组

winapi - GetLogicalDrives 和 FindFirstVolume+FindNextVolume 有什么区别?

ruby-on-rails - 有什么方法可以让 rack-livereload 运行得更快?

行之间的Postgresql差异

mysql - 查询差异: Grouped JOIN vs inline JOIN

c++ - 如何将整个结构设置为空?

arrays - 在 matlab 中创建 3D 矩阵

javascript - 如何将两个变量设置为一个

ruby - Ruby 中的模数每 10,000 次打印一次

ruby - ruby 中的大型矩阵代数计算