2012-01-30 165 views
0

我需要知道如何根據數組中的整數值將數組拆分爲子數組。我想要做的是將一個大陣列分成1-10,11-20,21-30等等,然後我需要計算這些子陣列的數量,這樣我的數字就像「7到10之間的整數,11到20之間的整數,21到30之間的整數。」如何根據整數值將數組拆分爲子數組

我有一行隨機數生成器,這將使我我的數組如下所示:

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

這給了我1到100,現在我需要之間的200百張隨機數的數組能夠根據價值將它們分開,並告訴每一個有多少。

然後我需要它來顯示這些數字。我到處搜索過,我想說你使用.partition來做這件事,但我無法讓它工作。

回答

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]] 
+0

謝謝。這很好,我只是想知道爲什麼它以看似隨意的順序給我。例如。從31-40開始,然後是41-50,然後是91-100,等等。 – user1179092 2012-01-30 22:53:15

+0

@ user1179092:這是因爲你的輸入數組是隨機順序的,而'group_by'引入了一個哈希值,可以進一步搞亂順序(取決於Ruby版本)。我在混音中添加了一個簡單的'sort_by'來強制下單。 – 2012-01-30 22:59:25

+0

我還有一個問題。我試圖讓它以特定的格式輸出,如果我可以在一行代碼中完成它,它將非常酷。有可能做我上面提到的問題嗎? – user1179092 2012-01-30 23:20:01

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之間等等。我沒有在任何地方運行該代碼,以便它可能有錯誤;)

+0

有沒有辦法來定義刺痛內「結果」。我和一位朋友打賭,我可以在三行代碼中做到這一點。一行來製作數組,其中一行將其分解爲數據,並且還有一行顯示答案。我也遇到了麻煩,試圖在您的代碼中辨別模式,以便爲其餘整數的屬性添加。部分賭注是,我不會在一行上用十幾個分號完成整個事情 – user1179092 2012-01-30 22:44:07