如何基于整数值将数组拆分为子数组

时间:2012-01-30 22:12:13

标签: ruby split integer arrays

我需要知道如何根据数组中整数的值将数组分成子数组。我想要做的是拿一个大阵列并将其分解为1-10,11-20,21-30 ...等等,然后我需要能够计算这些子阵列,所以我有数字,就像" 7个整数在1-10之间,6个整数在11-20之间,12个整数在21-30之间。"

我有一个单行随机数生成器,它会给我我的数组如下:

rand_num = (Array.new(200) {(1..100).to_a[rand(100)]})

这给了我200到100个随机数在1到100之间的数组,现在我需要能够根据值将它们分开并告诉每个数字。

然后我需要它来显示这些数字。我到处搜索过,我想说你用.partition做这件事,但我无法让它发挥作用。

2 个答案:

答案 0 :(得分:2)

如果您的存储桶真的那么简单,那么您可以像这样使用group_by

array.group_by { |n| (n - 1) / 10 }

这会给你像这样的哈希:

{0=>[1, 2, 3, ...], 1=>[11, 12, 13, ...], ...}

然后你只需要输入一个sort_by来强制排序,然后用map来总结结果:

array.group_by { |n| (n - 1) / 10 }.
      sort_by { |k, v| k }.
      map { |n, a| [10 * n + 1 .. 10 * (n + 1), a.length] }

例如:

# The %7 is just an easy way to get a non-uniform set.
>> (1..100).select { |n| n % 7 == 0 }
=> [7, 14, 21, 28, 35, 42, 49, 56, 63, 70, 77, 84, 91, 98]
>> (1..100).select { |n| n % 7 == 0 }.sort_by { |k, v| k }.group_by { |n| (n - 1) / 10 }.map { |n, a| [10 * n + 1 .. 10 * (n + 1), a.length] }
=> [[1..10, 1], [11..20, 1], [21..30, 2], [31..40, 1], [41..50, 2], [51..60, 1], [61..70, 2], [71..80, 1], [81..90, 1], [91..100, 2]]

答案 1 :(得分:0)

results = {}
rand_num.each do |x| 
  if x%10 == 0
    results[x/10 - 1] = [] unless results.key?(x/10 - 1)
    results[x/10 - 1] << x
  else
    results[x/10] = [] unless results.key?(x/10)
    results[x/10] << x
  end
end

现在在键0中,您的数字在1-10之间,在键1中在11-20等之间。我没有在任何地方运行此代码,因此它可能有错误;)