Ruby自定义字符串排序

输入字符串:

1654AaBcDddeeFF 

输出字符串:

 1456acddeeABDFF 

我试过的代码:

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

但我想最后看到大写字母。

由于@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" 

那这个呢?

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

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