Ruby自定义字符串排序

时间:2015-04-22 20:52:10

标签: ruby string sorting

输入字符串:

1654AaBcDddeeFF 

输出字符串:

1456acddeeABDFF

我试过的代码:

test_array = []
'1654AaBcDddeeFF'.each_byte do |char|
  test_array << char
end

test_array.sort.pack('C*')
# => 1456ABDFFacddee

但我希望最后能看到大写字符。

2 个答案:

答案 0 :(得分:13)

这个怎么样?

p '1654AaBcDddeeFF'.each_char.sort_by(&:swapcase).join #=> "1456acddeeABDFF"

编辑:正如@Cary Swoveland指出.chars只是.each_char.to_a的快捷方式,因为我们不需要to_a这里.each_char是一种更好的使用方法

答案 1 :(得分:3)

自@ hirolau已经被swapcase以来,我提供了另一种选择(尽管我更喜欢他的回答)。唉,@ Stefan发现了一个漏洞,但提出了一个很好的解决方案:

str = '1654AaBcDddeeFF'

order_array = [*'0'..'9',*'a'..'z',*'A'..'Z']
str.each_char.sort_by { |c| order_array.index(c) }.join
  #=> "1456acdeABDF" 

(我只是一名抄写员。)

这种方法的一个优点是您可以将其用于其他排序。例如,如果:

str = '16?54!AaBcDdde,eFF'

并且您还希望将字符“'!?”组合在一起,按顺序,您可以写下:

order_array = [*'!?,'.chars,*'0'..'9',*'a'..'z',*'A'..'Z']
str.each_char.sort_by { |c| order_array.index(c) }.join
  #=> "!?,1456acdeABDF" 

我们可以通过将order_array转换为哈希来提高效率。对于最后一个例子:

order_hash = Hash[order_array.each_with_index.to_a]

然后:

str.each_char.sort_by { |c| order_hash[c] }.join
  # => "!?,1456acddeeABDFF"