2015-02-06 50 views
2

的每第n個元件我有一個數組:組陣列

array = [1, 2, 3, 4, 5, 6, 7, 8, 9] 

我怎樣組陣列的每第n元素?例如,對於3:

[[1, 4, 7], [2, 5, 8], [3, 6, 9]] 

我寫了這個代碼,但它的醜陋:

array.each_with_index.group_by { |e, i| i % 3}.map {|h| h[1].map { |e| e[0] }} 
+1

@Makyen來吧讓幫助這個可憐的傢伙出來 – 2015-02-06 17:57:19

+0

@MohitBhasi,我們在這裏不是做別人的功課他們。幫助他們,是的。爲他們做,不。 – Makyen 2015-02-06 17:58:54

回答

3

尼克Veys的回答是最簡單的,但這裏是另一種方式。

array.group_by.with_index{|_, i| i % 3}.values 
#=> [[1, 4, 7], [2, 5, 8], [3, 6, 9]] 
+1

更好,因爲@NickVeys解決方案在下列情況下不起作用:1)我們的數組長度小於組數(例如它是3)2)在將數組長度分爲組數時,模數不爲0時出現錯誤 – Vlad 2015-02-06 22:09:12

0

試試這個出路:

irb(main):002:0> a = Array(1..9) 
=> [1, 2, 3, 4, 5, 6, 7, 8, 9] 
irb(main):004:0> a.each_slice(3).to_a.transpose # good 
=> [[1, 4, 7], [2, 5, 8], [3, 6, 9]] 

不是你想要的?讓我知道

+0

難道這只是放出'[[1,2,3],[4,5,6],[7,8,9]]'? – 2015-02-06 17:58:57

+0

哎呀,一個錯字忘記了轉置,thx提醒:) – 2015-02-06 18:01:41

5

這裏有一個簡單的方法:

array.each_slice(3).to_a.transpose 
#=> [[1, 4, 7], [2, 5, 8], [3, 6, 9]] 
+0

尼斯。 – 2015-02-06 18:16:59

0

這也可以通過創建一個散列,然後提取值來完成。對於Ruby 1.9+,這將保留數組元素的順序。

代碼

def bunch(arr,ngroups) 
    arr.each_with_index.with_object(Hash.new { |h,k| h[k]=[] }) { |(e,i),h| 
     h[i%ngroups] << e } 
    .values 
end 

arr = [1, 2, 3, 4, 5, 6, 7, 8, 9] 

bunch(arr,1) #=> [[1, 2, 3, 4, 5, 6, 7, 8, 9]] 
bunch(arr,2) #=> [[1, 3, 5, 7, 9], [2, 4, 6, 8]] 
bunch(arr,3) #=> [[1, 4, 7], [2, 5, 8], [3, 6, 9]] 
bunch(arr,4) #=> [[1, 5, 9], [2, 6], [3, 7], [4, 8]] 
bunch(arr,5) #=> [[1, 6], [2, 7], [3, 8], [4, 9], [5]] 
bunch(arr,6) #=> [[1, 7], [2, 8], [3, 9], [4], [5], [6]] 
bunch(arr,7) #=> [[1, 8], [2, 9], [3], [4], [5], [6], [7]] 
bunch(arr,8) #=> [[1, 9], [2], [3], [4], [5], [6], [7], [8]] 
bunch(arr,9) #=> [[1], [2], [3], [4], [5], [6], [7], [8], [9]] 

替代

如果參數是代替各組,grp_size的大小,我們可以計算:

ngroups = (arr.size+grp_size-1)/grp_size 

方法的手術線可以改爲寫:

arr.each_with_index.with_object({}) { |(e,i),h| (h[i%ngroups] ||= []) << e } 
    .values