我有一个数组,必须按低数字到高数字排序,然后按字母顺序排序。必须使用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 }
我知道这显然是错的,但我无法用整数和字符串组合来解决它。
答案 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"]