2015-09-23 17 views
0

現在我這樣做,它的工作原理:確定是否收集有不止一個最大值

groups = [[1, 1, 1], [2, 2]] 
groups.select { |g| g.size == groups.max.size }.size 
# => 1 # a clear majority 

groups = [[1, 1], [2, 2]] 
groups.select { |g| g.size == groups.max.size }.size 
# => 2 # needs to be passed to another filter 

,但我懷疑有一個更清潔的方式。

回答

3

你可以做到這一點的代碼片段:

groups.group_by(&:size)[groups.max.size].size 

讓我趕緊解釋這是什麼一樣。我提前抱歉的措詞不好,因爲「組」在這裏是一個相當超負荷的術語......

它的作用,首先是按大小對數組進行分組。這將返回一個哈希:

groups = [[1, 1, 1], [2, 2]] 
grouped = groups.group_by(&:size) 
# => {3=>[[1, 1, 1]], 2=>[[2, 2]]} 

然後,你把含有一樣多的元素,最大的羣組數組的數組現在

largest_list = grouped[groups.max.size] 
# => [[2, 2]] 

,你可以簡單的得到這個數組的大小,得到其中有這樣的長度組數:

largest_list.size 
# => 1 

之所以你的做法是相當緩慢的是,你在你的內部循環計算groups.max.size再次每次。

+0

這是一個更清潔,謝謝 - 我改名'groups':D – dax

相關問題