【问题标题】:Intersect each array in a array - Ruby与数组中的每个数组相交 - Ruby
【发布时间】:2023-03-14 15:15:02
【问题描述】:

我想在一个数组中找到每个数组元素的交点并取交点。

输入是数组数组,例如“'list_arrays',如下面的脚本中提到的” “过滤器”是需要对观察到的交叉点的总长度应用的限制 输出应该是这样的数组“[[2,4]]”

list_arrays = [[1, 2, 3, 4], [2, 5, 6], [1, 5, 8], [8, 2, 4]]
filter = 2

first_element_array = Array.new
list_arrays.each_with_index do |each_array1, index1|        
 list_arrays.each_with_index do |each_array2, index2|
  unless index1 < index2
   intersection = each_array1 & each_array2
   if intersection.length == filter.to_i
    first_element_array.push(intersection)
   end
  end
 end
end
puts first_element_array

上述过程需要很长的执行时间,因为我的数组数组太长(以百万行为单位)。我需要一种简单的 rubistic 方法来处理这个问题。有人对此有什么简单的想法吗?

【问题讨论】:

  • 用一个代码(尤其是当它不是一个好的代码)来代替表达你想要的东西是不好的。直接写你想要的。 filter = 2 是什么?
  • 另外,给出输入/输出的例子。这个问题很不清楚。
  • 此问题中添加了更多信息。感谢您的通知。
  • @PalaniKannan 我看到你编辑了这个问题,但没有太大区别。目前还很不清楚。你真的认为任何人都会理解你所说的restriction on intersection elements 的意思吗?
  • 好的。我编辑了更多信息。我在这里制作完美问题内容的经验较少。您的信息很有价值,我试图改进它。但是,对于像我这样的初学者来说,否决投票是令人沮丧的......无论如何,感谢您的信息:)。

标签: ruby arrays foreach each intersection


【解决方案1】:

解密您的代码似乎您要求的是“如果该交集具有一定大小(示例中为 2),则返回集合的对组合之间的交集”。我会写(功能方法):

list_arrays = [[1, 2, 3, 4], [2, 5, 6], [1, 5, 8], [8, 2, 4]]
list_arrays.combination(2).map do |xs, ys|
  zs = xs & ys 
  zs.size == 2 ? zs : nil
end.compact
#=> [[2, 4]]

建议的优化:1) 使用集合,2) 使用自定义抽象 Enumerable#map_compact(等效于 map+compact,但它会即时丢弃 nils,自己编写)。 3) 过滤掉不满足谓词的子数组:

require 'set'
xss = list_arrays.select { |xs| xs.size >= 2 }.map(&:to_set)
xss.combination(2).map_compact do |xs, ys|
  zs = xs & ys 
  zs.size == 2 ? zs : nil
end
#=> [#<Set: {2, 4}>]

【讨论】:

  • 谢谢@tokland。为了理解我:)
  • @PalaniKannan 你写了你想要的[[2, 4], [2, 8]],这不是这个答案给出的。您要么写错了问题,要么选择了错误的答案。
  • @sawa: list_arrays 已在问题中编辑,我使用的是原始值。
  • @tokland 我明白了。这个问题非常令人困惑。
  • 根据答案再次修改问题中的list_arrays。很抱歉混淆@sawa。我需要更多的经验才能比声望超过 20K 的人做得更好。我为我所有的错误道歉。我认为,这不是初学者的地方。可能适合极客。再次为我所有的错误道歉。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多