コードをきれいにしようとしています。最初のバージョンは を使用しeach_with_index
ます。2 番目のバージョンでは、ここでEnumerable.inject_with_index-construct
見つけた を使用してコードを圧縮しようとしました。
現在は機能していますが、最初のコードと同じくらいわかりにくいようです。さらに悪いことに、要素の周りの括弧、インデックスがわかりません
.. .inject(groups) do |group_container, (element,index)|
しかし、それらは必要です
- これらのブラケットの用途は何ですか?
- コードを明確で読みやすくするにはどうすればよいですか?
最初のバージョン -- "each_with_index" 付き
class Array
# splits as good as possible to groups of same size
# elements are sorted. I.e. low elements go to the first group,
# and high elements to the last group
#
# the default for number_of_groups is 4
# because the intended use case is
# splitting statistic data in 4 quartiles
#
# a = [1, 8, 7, 5, 4, 2, 3, 8]
# a.sorted_in_groups(3) # => [[1, 2, 3], [4, 5, 7], [8, 8]]
#
# b = [[7, 8, 9], [4, 5, 7], [2, 8]]
# b.sorted_in_groups(2) {|sub_ary| sub_ary.sum } # => [ [[2, 8], [4, 5, 7]], [[7, 8, 9]] ]
def sorted_in_groups(number_of_groups = 4)
groups = Array.new(number_of_groups) { Array.new }
return groups if size == 0
average_group_size = size.to_f / number_of_groups.to_f
sorted = block_given? ? self.sort_by {|element| yield(element)} : self.sort
sorted.each_with_index do |element, index|
group_number = (index.to_f / average_group_size).floor
groups[group_number] << element
end
groups
end
end
2 番目のバージョン -- WITH "inject" AND インデックス
class Array
def sorted_in_groups(number_of_groups = 4)
groups = Array.new(number_of_groups) { Array.new }
return groups if size == 0
average_group_size = size.to_f / number_of_groups.to_f
sorted = block_given? ? self.sort_by {|element| yield(element)} : self.sort
sorted.each_with_index.inject(groups) do |group_container, (element,index)|
group_number = (index.to_f / average_group_size).floor
group_container[group_number] << element
group_container
end
end
end