合并内部索引数组(如果它们包含相同的内容)

时间:2014-06-30 22:02:25

标签: ruby

我正在生成一组分组索引。索引是满足我的分组要求的数组中的点。例如,我将网格中的索引分组,其中事物彼此水平“接近”。这就是我将要合作的内容。

[[0,1,2],[3],[4,5],[5,6],[7,8],[8,9]]

我想通过常用索引合并。所以结果应该是这样的。

[[0,1,2],[3],[4,5,6],[7,8,9]]

感觉它应该是一个注入:如果任何内部项目匹配,就成对。但我没有看到Ruby的方法来做到这一点。

4 个答案:

答案 0 :(得分:1)

了解Ruby,这可能是一种更简洁的方法,但这应该可以满足您的需求:

foo = [[0,1,2],[3],[4,5],[5,6],[7,8],[8,9]]

foo.inject([]) {|result,element|
  if (result and existing = result.find_index{|a| !(element & [*a]).empty?})
    tmp = result[existing]
    result.delete_at(existing)
    result << (tmp | element).sort
  else
    result << element
  end
}.sort

输出:

=> [[0, 1, 2], [3], [4, 5, 6], [7, 8, 9]]

<强>逻辑:

对于原始数组中的每个element,检查新构建的array-so-far(result)是否包含任何与使用数组交集的下一个元素相同的数字的条目 - - !(element & [*a]).empty? ...

  • 如果找到,请从result中移除所述条目,将其与原始数组中的新element合并 - (tmp | element) - 然后将其添加回result }
  • 如果找不到,只需将原始数组中的element连接到result

答案 1 :(得分:1)

x.sort.inject([]) do |y, new|
  (((y.last || []) & new).length > 0) ? y[0..-2].push(y.last | new) : y.push(new)
end.map(&:sort)

答案 2 :(得分:1)

有人可能会找到一种更紧凑的方法,但这有效......

array = [[0,1,2],[3],[4,5],[5,6],[7,8],[8,9]]
(0...array.length).each do |a|
  (a+1...array.length).each do |b|
    unless array[a].to_a  & array[b].to_a == []
      array[a].push(array[b]).flatten!.uniq!.sort!
      array.delete_at(b)
      b -= 1
    end
  end
end

p array
=> [[0, 1, 2], [3], [4, 5, 6], [7, 8, 9]]

答案 3 :(得分:1)

到目前为止,解决方案对我来说似乎过于复杂。我建议这个(假设arr的每个元素都是非空的并且只包含整数):

arr = [[0, 1, 2], [3],
       [4, 5], [5, 6],
       [7, 8, 9], [9, 10], [10, 11],
       [12, 13], [13], [13, 14]]

arr.each_with_object([]) do |a,b|
  if b.any? && b.last.last == a.first
    b[-1] += a[1..-1]
  else
    b << a
  end
end
  #=> [[0, 1, 2], [3], [4, 5, 6], [7, 8, 9, 10, 11], [12, 13, 14]]

您可以通过使用枚举器单步执行arr来执行此操作:

enum = arr.each
b = [enum.next]
loop do
  a = enum.next
  if b.last.last == a.first
    b[-1] += a[1..-1]
  else
    b << a
  end
end
b