繁体   English   中英

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

[英]How to split an array into sub-arrays based on integer values

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

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

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

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

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

如果您的存储桶真的那么简单,那么您可以像这样使用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]]
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之间等.ps我没有在任何地方运行此代码,因此它可能有错误;)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM