【问题标题】:Ruby - How to isolate the first digit of every element in an array?Ruby - 如何隔离数组中每个元素的第一个数字?
【发布时间】:2019-04-15 17:44:16
【问题描述】:

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

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

我需要逐位比较所有元素。 例如,比较“9”、“99”和“958”很重要,因为我需要像这样将“99”放在末尾:

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

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

【问题讨论】:

  • 你能提供更多关于你的排序规则的上下文吗?您可以使用 list1.map(&:to_s).sort 转换为字符串,并按照我 think 的要求对其进行排序,但是您的第二个示例没有对列表的前半部分进行排序(例如,为什么 50在 2 之前排序?)
  • 嘿!我必须用数组的所有元素写出最大的数字。例如:[50, 2, 1, 9] 应该输出数字“95021”。这就是为什么我必须逐位比较元素的原因。 (对不起我的第二个例子,我没有检查数组的开头;))
  • “对不起我的第二个例子”?您是指问题中的示例吗?如果是这样,您为什么不编辑问题来解决它?我看到您是 SO 新手,但是您应该纠正问题中的错误不是常识吗?另外,如果你想构造一个字符串(例如,“95021”),你为什么不在你的问题中这么说呢?

标签: arrays ruby compare element digits


【解决方案1】:

我认为您正在寻找的是:

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]
    

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

    【讨论】:

    • 虽然这看起来是正确的,而且乍一看很优雅,但这实际上并不起作用。 &lt;=&gt; 比较器假定较长的字符串大于较短的字符串(当前导字符相同时)。但是,在这种情况下,应将较短的字符串视为较大。 [10, 9, 95] 已按此逻辑排序,但 95910 小于 99510
    【解决方案3】:

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

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

    【讨论】:

    • 非常感谢您的帮助 Jay Dorsey 和 Hari Gopal!我明天会尝试“双重映射”,当然我会检查你的解决方案,阅读其他方法总是很有趣;)
    • 我试过了,这很完美!!!!我正在考虑将其转换为字符串,但我不确定之后如何进行!谢谢大家的帮助:)
    猜你喜欢
    • 1970-01-01
    • 2021-12-17
    • 1970-01-01
    • 2020-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多