仅包含不同值的子数组中的Ruby Split数组

问题描述 投票:0回答:1

我有以下形式的数组:

[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,但无法完成此操作。

感谢阅读!

ruby-on-rails arrays ruby hash
1个回答
1
投票

我假设您要拥有最少数量的子数组。

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::newArray::new的形式。

如果是h = Hash.new(0),则如果h没有键k,则h[k]返回默认值,此处为零。当执行h[k] += 1时,Ruby的第一步是将该表达式转换为:

h[k] = h[k] + 1

如果h没有键k,则等式右边的表达式h[k]返回零。

© www.soinside.com 2019 - 2024. All rights reserved.