Как разбить массив на подмассивы на основе целочисленных значений - PullRequest
0 голосов
/ 31 января 2012

Мне нужно знать, как разбить массив на подмассивы, основываясь на значении целых чисел в массиве.То, что я пытаюсь сделать, это взять большой массив и разбить его на 1-10, 11-20, 21-30 ... и т. Д., И тогда мне нужно будет иметь возможность подсчитать эти вложенные массивы, чтобы у меня были числа, которые похожи на"7 целых чисел от 1 до 10, 6 целых чисел от 11 до 20, 12 целых чисел от 21 до 30."1003 *

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

Это дает мне мой массив из 200 сотен случайных чисел от 1 до 100, и теперь мне нужно иметь возможность разделить их по значению и сказать, сколько в каждом из них.

Тогда мне нужно, чтобы отобразить эти цифры.Я искал везде, и я хочу сказать, что вы делаете это с .partition, но я просто не могу заставить его работать.

Ответы [ 2 ]

2 голосов
/ 31 января 2012

Если ваши корзины действительно настолько просты, то вы можете использовать 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]]
0 голосов
/ 31 января 2012
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 Я нигде не запускал этот код, поэтому он может содержать ошибки;)

...