什么是在ruby中对字符串进行排序以便空字符串结束的好方法?

dgs*_*san 5 ruby

在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将空字符串放在最后?仅映射到没有空字符串的数组,排序,然后在末尾填充空字符串会更好吗?还有其他方法吗?

Car*_*and 7

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)


eng*_*nky 4

我能想到的最简单的解决方案是

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 处的元素成为新数组的第一个元素。

所以我们只需按空字符串的数量进行旋转 ( "")