我有以下形式的数组:
[20, 20, 21, 21, 21, 21]
我正在尝试找到一种将数组拆分为仅包含不同值的子数组的方法。例如:
[[20,21], [20,21], [21], [21]]
此示例仅包含两个不同的值,但是主数组可能包含多个不同的值。
另一个例子是[20,20,21,21,21,21,22] => [[20,21,22],[20,21],[21],[21]]
重要的是,如果主数组有6个元素,则最终的子数组总数将等于该数量。
我一直在玩组合,排列和group_by,但无法完成此操作。
感谢阅读!
我假设您要拥有最少数量的子数组。
arr = [20, 20, 21, 21, 21, 21, 22, 23, 22]
h = arr.each_with_object(Hash.new(0)) { |n,h| h[n] += 1 }
#=> {20=>2, 21=>4, 22=>2, 23=>1}
a = Array.new(h.values.max) { Array.new { [] } }
#=> [[], [], [], []]
h.each { |n,freq| freq.times { |i| a[i] << n } }
a #=> [[20, 21, 22, 23], [20, 21, 22], [21], [21]]
h.values.max
#=> 4
告诉我们,我们至少需要4个子数组(用于21
)。 4
显然足够,因为我们只需将每组相等的元素分配给不同的子数组。
请参阅采用默认值的Hash::new和Array::new的形式。
如果是h = Hash.new(0)
,则如果h
没有键k
,则h[k]
返回默认值,此处为零。当执行h[k] += 1
时,Ruby的第一步是将该表达式转换为:
h[k] = h[k] + 1
如果h
没有键k
,则等式右边的表达式h[k]
返回零。