删除数组数组中类似数组的有效方法

时间:2014-06-18 10:10:27

标签: ruby arrays

我正在尝试分析一些文档并找到相似之处。经过分析,我有一个数组,其中的元素是来自被认为相似的文档的数据数组。但有时我有两个几乎相似的元素,自然我想留下最大的元素。为简化起见:

data = [[1,2,3,4,5,6], [7,8,9,10], [1,2,3,5,6]...]

如何有效地处理我得到的数据:

data = [[1,2,3,4,5,6], [7,8,9,10]...]

我想我可以交叉每个数组,如果相交的数组与原始数组之一匹配 - 我会忽略它。这是我写的快速代码:

data = [[1,2,3,4,5,6], [7,8,9,10], [1,2,3,5,6], [7,9,10]]
cleaned = []

data.each_index do |i|
  similar = false
  data.each_index do |j|
    if i == j
      next
    elsif data[i]&data[j] == data[i]
      similar = true
      break
    end
  end
  unless similar
    cleaned << data[i]
  end
end

puts cleaned.inspect

这是一种有效的方法吗?此外,当前行为只允许省略少数元素的数组,如果发生这种情况,我可能想要合并类似的数组:

[[1,2,3,4,5], [1,3,4,5,6]] => [[1,2,3,4,5,6]]

1 个答案:

答案 0 :(得分:1)

如果列表完全包含在另一个元素中,您可以删除列表中的任何元素:

data.delete_if do |arr|
  data.any? { |a2| !a2.equal?(arr) && arr - a2 == [] }
end
# => [[1, 2, 3, 4, 5, 6], [7, 8, 9, 10]]

这比你的建议更有效,因为一旦你决定删除一个元素,你就不会在下一次迭代中检查它。