对与整数和字符串混合的数组进行排序 - Ruby

时间:2014-08-06 21:36:16

标签: ruby arrays sorting

我有一个数组,必须按低数字到高数字排序,然后按字母顺序排序。必须使用Array#sort_by

 i_want_dogs = ["I", "want", 5, "dogs", "but", "only", "have", 3]

我希望它输出:

 => [3,5,"I","but","dogs","have","only","want"]

我试过了:

 i_want_dogs.sort_by {|x,y| x <=> y }

我知道这显然是错的,但我无法用整数和字符串组合来解决它。

4 个答案:

答案 0 :(得分:5)

sort方法与一个块一起使用,该块定义了一个可以满足您需要的比较器。我写了一个简单的例子,它在类相同时比较值,在不同时比较类名。

def comparator(x, y)
  if x.class == y.class
    return x <=> y
  else
    return x.class.to_s <=> y.class.to_s
  end
end

像这样使用:

i_want_dogs.sort { |x, y| comparator(x, y) }

答案 1 :(得分:2)

使用partition将数字与字符串分开,单独排序并加入最终结果,例如

i_want_dogs.partition { |i| i.is_a?(Fixnum) }.map(&:sort).flatten

答案 2 :(得分:2)

这会给你结果:

i_want_dogs.sort_by {|x| x.to_s }

<强>更新

感谢@vacawama,他指出它会按字母顺序对数字进行排序。如果你需要按照它的值对数字进行排序,那么你需要尝试其他答案。

答案 3 :(得分:1)

首先,您需要将数组中的元素转换为字符串。试试这个

i_want_dogs.sort_by(&:to_s)

这将返回

[3,5,"I", "but", "dogs", "have", "only" "want"]