【发布时间】:2017-07-20 06:49:26
【问题描述】:
请您帮忙。我有 3 组值的 input_array。
我需要的组序是:
1st group: Pou
2nd group: Apl
3rd group: Gab
这个顺序已经在 input_array 中完成了,但是我想对每个组进行升序排序。
到目前为止,我的脚本会产生下表中心列中给出的输出(当前输出)。
input_arr = ["Pou-12","Pou-7","Pou-4","Pou-8","Pou-9","Pou-11","Pou-10","Pou-3","Pou-2","Pou-1","Pou-6","Pou-5","Apl","Gab-3","Gab-5","Gab-4","Gab-1","Gab-2"]
b=input_arr.sort_by do |s|
if s =~ /^\d+$/
[2, $&.to_i]
else
[1, s]
end
end
puts b
下面也显示了所需的排序输出数组。
input array | current output | desired output array
Pou-12 | Apl | Pou-1
Pou-7 | Gab-1 | Pou-2
Pou-4 | Gab-2 | Pou-3
Pou-8 | Gab-3 | Pou-4
Pou-9 | Gab-4 | Pou-5
Pou-11 | Gab-5 | Pou-6
Pou-10 | Pou-1 | Pou-7
Pou-3 | Pou-10 | Pou-8
Pou-2 | Pou-11 | Pou-9
Pou-1 | Pou-12 | Pou-10
Pou-6 | Pou-2 | Pou-11
Pou-5 | Pou-3 | Pou-12
Apl | Pou-4 | Apl
Gab-3 | Pou-5 | Gab-1
Gab-5 | Pou-6 | Gab-2
Gab-4 | Pou-7 | Gab-3
Gab-1 | Pou-8 | Gab-4
Gab-2 | Pou-9 | Gab-5
更新
Cary 用数组代替哈希的解决方案。
a = ["Pou-7","Pou-4","Gab-4","Pou-8","Pou-9","Pou-11","Pou-10","Pou-3","Pou-2","Pou-1","Pou-6","Pou-5","Apl","Gab-3","Gab-5","Gab-1","Pou-12","Gab-2"]
order = [ "Pou", "Apl", "Gab" ]
a.map{ |s| head,tail = s.split("-"); [order.index(head), tail.to_i, s]}.sort.map(&:last)
=> ["Pou-1", "Pou-2", "Pou-3", "Pou-4", "Pou-5", "Pou-6", "Pou-7", "Pou-8", "Pou-9",
"Pou-10", "Pou-11", "Pou-12", "Apl", "Gab-1", "Gab-2", "Gab-3", "Gab-4", "Gab-5"]
【问题讨论】:
-
Ger,SO 的惯例是将问题和答案分开,并且在问题的情况下,一旦发布就不要修改它们,除非需要更正或澄清。这在这里无关紧要,但提问者有时会发布他们自己的答案,当他们这样做时,这是作为答案,而不是对问题的修改。
-
感谢分享,但这样做是惯例还是规则?
-
Ger,我不知道是否有关于此的规则,但如果您查看已被支持的 SO 问题,您将很少会看到提供答案的附录。部分原因可能只是通过将问题和答案分开来减少重复。邀请其他读者提供他们对这个问题的看法。