【问题标题】:“natural” sort an array in Ruby“自然”在 Ruby 中对数组进行排序
【发布时间】:2014-02-19 23:50:10
【问题描述】:

我有一个包含数字和字母的数组,例如:

newArray = [“1 a”,“1 b”,“2 c”,“2 a”]

我想按照预期输出的方式对它们进行排序,如下所示:

newArray = [“2 a”,“2 c”,“1 a”,“1 b”]

我要做的是按降序对数字进行排序,如果数字相同,则按字母顺序排序

我可以在 sort_by 中实现一个比较函数吗,或者有没有办法使用 ruby​​ 排序来做到这一点

【问题讨论】:

    标签: ruby-on-rails ruby arrays sorting natural-sort


    【解决方案1】:

    首先,您应该使用更好的输入表示法。您可以像这样解析现有数组:

    arr = newArray.map { |s| x,y = s.split; [x.to_i, y] }
    # => [[1, "a"], [1, "b"], [2, "c"], [2, "a"]]
    

    然后我们可以使用sort_by进行排序:

    arr.sort_by { |x,y| [-x, y] }
    # => [[2, "a"], [2, "c"], [1, "a"], [1, "b"]]
    

    【讨论】:

    • 我是红宝石新手。所以还在学习。有没有办法可以将排序后的映射转换回原始数组格式,因为我需要维护格式以便在代码中进行其他比较。
    • @blathia:您可以使用另一种映射和字符串格式来做到这一点,例如使用String#%。也就是说,我建议不要使用字符串来表示值的元组。您将失去类型安全性并且字符串的处理会很尴尬(如您所见,即使对于这个简单的应用程序,我们仍然需要解析字符串)
    • 存储arr= arr.sort_by { |x,y| [-x, y] } 然后做arr.map{|a| a=a.join(" ")}
    • @KirtiThorat:你意识到我故意没有给出完整的解决方案吗?这也有一些教学方面:)
    • @NiklasB。我有点想到这一点,但决定让他的生活轻松一点。 :)
    【解决方案2】:

    类似于@NiklasB。上面的答案(复制了他的sort_by

    arr.map(&:split).sort_by { |x,y| [-x.to_i, y] }
    
    => [["2", "a"], ["2", "c"], ["1", "a"], ["1", "b"]]
    

    【讨论】:

    • 这是更 Ruby-ish 的解决方案。
    【解决方案3】:

    用一种不太优雅的方式,你可以做到这一点

        arr.sort! do |p1, p2|
          num1, str1 = p1.split(' ')
          num2, str2 = p2.split(' ')
          if (num1 != num2)
            p2 <=> p1
          else
            p1 <=> p2
          end
        end
        $stdout.puts arr
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-11-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-07
      相关资源
      最近更新 更多