arr = [
[:reference],
[:parent_ref, :kind],
[:kind, :parent_ref, :reference],
[:parent_ref, :kind],
[:parent_ref, :kind, :status],
[:kind, :parent_ref, :kind]
]
请注意,我已经修改了示例中给出的
keys
,以包括两种类型的重复项。
require 'set'
h = arr.each_with_object(Hash.new { |h,k| h[k] = [] }) { |a,h| h[a.to_set] << a }
g = h.each_key.with_object({}) do |k,g|
g[k] = h[k].dup
h.each { |kk,v| g[k].concat(v) if k < kk }
end
a = g.max_by { |k,v| v.size }
[a.last.first, a.last.drop(1)]
这显示了数组[:parent_ref, :kind]
,在转换为集合后,是以下其他元素的子集array
在转换为集合后:
[[:parent_ref, :kind], [:kind, :parent_ref, :kind],
[:kind, :parent_ref, :reference], [:parent_ref, :kind, :status]]
并且在将arr
的所有元素转换为集合后,没有其他元素具有更多的超集。
请注意,如果需要,可以链接g
和a
的计算。
请参见Set#<。
如果arr
或arr
的任何元素都不包含重复项,则计算当然会简化。
arr = [
[:reference],
[:parent_ref, :kind],
[:kind, :parent_ref, :reference],
[:parent_ref, :kind, :status]
]
require 'set'
sets = arr.map(&:to_set)
h = sets.each_with_object(Hash.new { |h,k| h[k] = [] }) { |s,h|
sets.each { |ss| h[s] << ss if s < ss } }
k, v = h.max_by { |_,v| v.size }
[k.to_a, v.map(&:to_a)]