递归地从多维数组中查找一组公共元素

发布于 2024-08-27 16:06:53 字数 157 浏览 6 评论 0原文

我有一个多维数组:

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

我必须比较所有 4 个子数组并获取公共元素。接下来,一次取 3 个子数组并获取公共元素。然后一次取 2 个子数组并获取公共元素,在红宝石中。

I have a multi-dimensional array:

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

i've to compare all the 4 sub-arrays and get common elements.Next,take 3 subarrays at a time and get common elements.then take 2 sub arrays at a time and get common elements, in RUBY.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

情栀口红 2024-09-03 16:06:53

这应该可以在最近的 Ruby 版本中完成工作:

a.length.downto(1).map{|i| a.combination(i).map{|sub| sub.inject(&:&)}}
#=> [[[]], [[], [3, 4], [2], [1]], [[3, 4], [2], [2, 3, 4], [1], [1, 3, 4], [1, 2]], [[2, 3, 4], [1, 3, 4], [1, 2], [1, 2, 3, 4]]]

这是一个具有类似解决方案的相关问题。 “技巧”在方法 Array#& 中,它计算两个数组的交集(作为集合运算)。它是关联操作,因此我们可以依次将其应用于每个子数组,保留累加的结果,因此 inject 非常适合它。简而言之,array.inject(&:&) 将在 array 的每个成员中生成元素的最大公共子集。 &:& 只是 Ruby 的简写,用于从名为 & 的方法中创建 Proc 并将其作为块提交给 注入,而不是编写:

array.inject{|a,e| a & e}

This should do the job in recent Ruby versions:

a.length.downto(1).map{|i| a.combination(i).map{|sub| sub.inject(&:&)}}
#=> [[[]], [[], [3, 4], [2], [1]], [[3, 4], [2], [2, 3, 4], [1], [1, 3, 4], [1, 2]], [[2, 3, 4], [1, 3, 4], [1, 2], [1, 2, 3, 4]]]

Here's a related question with similar solution. The "trick" is in method Array#&, which calculates the intersection (as a set operation) of the two arrays. It is associative operation, so we can apply it on each subarray in turn, keeping the accumulated result, hence inject is perfect for it. In short, array.inject(&:&) will result with a greatest common subset of elements in every member of array. &:& is just a Ruby shorthand for making a Proc out of method named & and submitting it as a block to inject, instead of writing:

array.inject{|a,e| a & e}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文