Ruby - 如何隔离数组中每个元素的第一个数字?

问题描述 投票:0回答:3

我有一个数字像这样的数组:

list1 = [50,2,99,1,958,9,6,80]

我需要比较所有元素:逐位数字。例如,比较“9”,“99”和“958”是很重要的,因为我需要将“99”放在最后,如下所示:

list1 = [1,2,50,6,80,9,958,99]

Ruby有这个功能吗?非常感谢您的帮助 :)

arrays ruby compare element digits
3个回答
3
投票

我认为你在寻找的是:

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"

2
投票

试试这个:比较转换为字符串的值,使用String#<=>Array#sort

list1.sort { |a, b| a.to_s <=> b.to_s }
#=> [1, 2, 50, 6, 80, 9, 958, 99]

如果我理解这个问题,即使输出的前三个元素让我对逻辑感到困惑。


-1
投票

要仅提取第一个数字,您只需要映射两次:

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,以防你感兴趣。

© www.soinside.com 2019 - 2024. All rights reserved.