我正在生成一组分组索引。索引是满足我的分组要求的数组中的点。例如,我将网格中的索引分组,其中事物彼此水平“接近”。这就是我将要合作的内容。
[[0,1,2],[3],[4,5],[5,6],[7,8],[8,9]]
我想通过常用索引合并。所以结果应该是这样的。
[[0,1,2],[3],[4,5,6],[7,8,9]]
感觉它应该是一个注入:如果任何内部项目匹配,就成对。但我没有看到Ruby的方法来做到这一点。
答案 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