如果你的水桶真的是那麼簡單,那麼你可以使用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]]
謝謝。這很好,我只是想知道爲什麼它以看似隨意的順序給我。例如。從31-40開始,然後是41-50,然後是91-100,等等。 – user1179092 2012-01-30 22:53:15
@ user1179092:這是因爲你的輸入數組是隨機順序的,而'group_by'引入了一個哈希值,可以進一步搞亂順序(取決於Ruby版本)。我在混音中添加了一個簡單的'sort_by'來強制下單。 – 2012-01-30 22:59:25
我還有一個問題。我試圖讓它以特定的格式輸出,如果我可以在一行代碼中完成它,它將非常酷。有可能做我上面提到的問題嗎? – user1179092 2012-01-30 23:20:01