在Ruby中,默认排序首先放置空字符串.
['', 'g', 'z', 'a', 'r', 'u', '', 'n'].sort
Run Code Online (Sandbox Code Playgroud)
得到:
["", "", "a", "g", "n", "r", "u", "z"]
Run Code Online (Sandbox Code Playgroud)
但是,在最后想要空字符串是很常见的.
做类似的事情:
['', 'g', 'z', 'a', 'r', 'u', '', 'n'].sort { |a, b| a[0] && b[0] ? a <=> b : a[0] ? -1 : b[0] ? 1 : 0 }
Run Code Online (Sandbox Code Playgroud)
工作并给出:
["a", "g", "n", "r", "u", "z", "", ""]
Run Code Online (Sandbox Code Playgroud)
但是,这不是很易读,也不是很灵活.
是否有一种合理而干净的方法可以让sortRuby将空字符串放在最后?仅映射到没有空字符串的数组,排序,然后在末尾填充空字符串会更好吗?还有其他方法吗?
arr = ["g", "u", "", "a", "", "r", "n", "z"]
arr.sort_by { |s| [s.empty? ? 1 : 0, s] }
#=> ["a", "g", "n", "r", "u", "z", "", ""]
Run Code Online (Sandbox Code Playgroud)
要么
arr.sort_by { |s| s.empty? ? 255.chr : s }
# => ["a", "g", "n", "r", "u", "z", "", ""]
Run Code Online (Sandbox Code Playgroud)
要么
empty, non_empty = arr.partition(&:empty?)
#=> [["", ""], ["g", "u", "a", "r", "n", "z"]]
non_empty.sort.concat empty
#=> ["a", "g", "n", "r", "u", "z", "", ""]
Run Code Online (Sandbox Code Playgroud)
我能想到的最简单的解决方案是
a = ['', 'g', 'z', 'a', 'r', 'u', '', 'n']
a.sort.rotate(a.count(''))
#=> ["a", "g", "n", "r", "u", "z", "", ""]
Run Code Online (Sandbox Code Playgroud)
Array#rotate:通过旋转 self 返回一个新数组,使 count 处的元素成为新数组的第一个元素。
所以我们只需按空字符串的数量进行旋转 ( "")