我不知道如何正确地提出问题,但我想要的是以下内容:
假设有一个像
这样的数组function alertText(string){
alert(string);
}
如何对其进行排序,直到它成为输出:
[1,1,1,1,2,2,2,3,3,3,4,4,5]
使输出更具可读性:
[1,2,3,4,5,1,2,3,4,1,2,3,1]
到目前为止我所得到的是:
[[1,2,3,4,5],[1,2,3,4],[1,2,3],[1]]
但由于没有相同的数字,这会引发错误。
有人可以帮忙吗?
答案 0 :(得分:3)
这需要一段时间才能做到这一点,但这就是你想要的:
array = [1,1,1,1,2,2,2,3,3,3,4,4,5]
a = array.group_by{|n| n }.values.sort_by(&:length).reverse
a.each{|q| (a[0].size-q.size).times{q<<nil}}
a.sort.transpose.flatten.compact
它产生:
=> [1, 2, 3, 4, 5, 1, 2, 3, 4, 1, 2, 3, 1]
*你有3个人数
答案 1 :(得分:1)
▶ array = [1,1,1,1,2,2,2,3,3,3,4,4,5]
▶ tap = array.group_by(&:to_i).values.sort do |i, j|
▷ result = j.length <=> i.length
▷ result.zero? ? i <=> j : result
▷ end
▶ tap.map do |e|
▷ e.fill nil, (e.length...tap.first.length)
▷ end.transpose.flatten.compact
#⇒ [1, 2, 3, 4, 5, 1, 2, 3, 4, 1, 2, 3, 1]
答案 2 :(得分:0)
也提出了我自己的答案。
array = [1,1,1,1,2,2,2,3,3,3,4,4,5]
# group all the values in single array
a = array.group_by{|n| n }.values.sort{|a,b| b.size <=> a.size }
# fill every other space in the other subarrays with nil
a.each{|q| q.fill(nil, (a[0].size...q.size)) }
# transpose, flatten and remove all the nil values
a.transpose.flatten.compact
如果有人知道“更小”更易读的答案,请告诉我们。
答案 3 :(得分:0)
让arr
成为您的数组。然后:
def transform(arr)
a = arr.sort
b = []
until a.empty?
u = a.uniq
b << u
a = a.difference(u)
end
b
end
帮助Array#difference
在我的回答here中定义。
让我们试一试:
transform(arr)
#=> [[1,2,3,4,5], [1,2,3,4], [1,2,3], [1]]