我有一个数字像这样的数组:
list1 = [50,2,99,1,958,9,6,80]
我需要比较所有元素:逐位数字。例如,比较“9”,“99”和“958”是很重要的,因为我需要将“99”放在最后,如下所示:
list1 = [1,2,50,6,80,9,958,99]
Ruby有这个功能吗?非常感谢您的帮助 :)
我认为你在寻找的是:
list1.sort_by(&:to_s)
所以,这将导致:
[50, 2, 99, 1, 958, 9, 6, 80].sort_by(&:to_s)
#=> [1, 2, 50, 6, 80, 9, 958, 99]
[50, 2, 1, 9].sort_by(&:to_s)
#=> [1, 2, 50, 9]
如果您想要逆序,您可以:
[50, 2, 99, 1, 958, 9, 6, 80].sort_by(&:to_s).reverse
#=> [99, 958, 9, 80, 6, 50, 2, 1]
[50, 2, 1, 9].sort_by(&:to_s).reverse
#=> [9, 50, 2, 1]
你可以做.join
来获取连接的字符串:
[50, 2, 1, 9].sort_by(&:to_s).reverse.join
#=> "95021"
试试这个:比较转换为字符串的值,使用String#<=>和Array#sort:
list1.sort { |a, b| a.to_s <=> b.to_s }
#=> [1, 2, 50, 6, 80, 9, 958, 99]
如果我理解这个问题,即使输出的前三个元素让我对逻辑感到困惑。
要仅提取第一个数字,您只需要映射两次:
list = [50, 2, 99, 1, 958, 9, 6, 80]
p list.map(&:to_s).map { |n| n[0] }
# => ["5", "2", "9", "1", "9", "9", "6", "8"]
更新:我在下面链接的解决方案不正确。问题并不像看起来那么简单。
老答案如下:
然而,问题本身看起来很有趣,所以我试了一下 - 即,从数字列表中形成最大可能的数字。但是,我不想破坏你的乐趣,所以这里是一个link to a gist that solves the problem through normalization,以防你感兴趣。