在Ruby中按字母顺序对数组进行排序,但最后使用大写单词

我试图在Ruby中按字母顺序对字符串进行排序。 问题是,它将大写单词放在字符串的开头,但我最后想要它们。

我原来的字符串是: ["Apple", "banana", "Zebra", "orange"]

我想要的: ["banana", "orange", "Apple", "Zebra"]

交换案例进行排序:

 ["Apple", "banana", "Zebra", "orange"].sort_by(&:swapcase) #=> ["banana", "orange", "Apple", "Zebra"] 

我假设您要对字符串进行排序,但将大写单词移动到排序算法的末尾。

如果只有第一个字符大写,则此方法有效:

 p ["banana", "Banana","orange", "Apple", ].sort_by{|x| [x[0].upcase==x[0] ? 1:0,x] } #=> ["banana", "orange", "Apple", "Banana"] p ["banana", "Banana","orange", "Apple", ].sort #=> ["Apple", "Banana", "banana", "orange"] 

编辑:显然根据Cary Swoveland,这将比使用sort_by更快,我倾向于相信他,因为sort已经如此优化。

 def new_sort(array) cap, non = array.partition {|el|el[0] == el[0].upcase} non.sort + cap.sort end puts new_sort ["Apple", "banana", "Zebra", "orange"] # banna # orange # Apple # Zebra puts new_sort ["THREE", "two", "one",] # one # two # THREE 

另一种方式:

 arr = %w{ Apple banana Zebra Camel iPhone waffles Pancakes } # => ["Apple", "banana", "Zebra", "Camel", "iPhone", "waffles", "Pancakes"] arr.sort.rotate(arr.count { |s| s[/^[AZ]/] }) # => ["banana", "iPhone", "waffles", "Apple", "Camel", "Pancakes", "Zebra"] 

我们有:

 a = arr.sort # => ["Apple", "Camel", "Pancakes", "Zebra", "banana", "iPhone", "waffles"] nbr_capitalized_words = arr.count { |s| s[/^[AZ]/] } #=> 4 a.rotate(nbr_capitalized_words) #=> ["banana", "iPhone", "waffles", "Apple", "Camel", "Pancakes", "Zebra"]