如何对一组int和字符串进行排序?

时间:2016-01-15 14:48:09

标签: arrays ruby sorting natural-sort

我正在尝试使用int和字符串的混合对数组进行排序。举个例子:

a = ["a", "b", 5, "c", 4, "d", "a1", "a12", 3, 13, 2, "13a", "12a"]

我试过了:

a.sort do |x, y|
  if x.class == y.class
    x <=> y
  else
    x.class.to_s <=> y.class.to_s
  end
end

返回:

[2, 3, 4, 5, 13, "12a", "13a", "a", "a1", "a12", "b", "c", "d"]

我想要的结果是:

[2, 3, 4, 5, "12a", 13, "13a", "a", "a1", "a12", "b", "c", "d"]

1 个答案:

答案 0 :(得分:11)

a.sort_by { |x| [(x.to_s.match(/^\d+/) ? x.to_i : 1.0 / 0), x.to_s] }

我们的想法是首先按数值排序,然后按字符串值排序。如果字符串不以数字值开头,则强制将数值视为无穷大。

编辑:由于OP明确表示他不仅要考虑领先的数值,而是考虑所有后面的数值,我们可以使用相同的想法,这次我们必须将它应用于每个字符串中的单个数字和非数字实体:

a.sort_by do |x|
  x.to_s.split(/(\D+)/).map do |y|
    [(y.match(/\d/) ? y.to_i : 1.0 / 0), y]
  end
end