“自然”在Ruby中对数组进行排序

时间:2014-02-19 23:50:10

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

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

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

我想按照以下方式对输出进行排序:

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

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

我可以在sort_by中实现比较函数,还是有办法使用ruby sort

来实现

3 个答案:

答案 0 :(得分:7)

首先,您应该更好地表达您的输入。您可以解析现有数组,例如:

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"]]

答案 1 :(得分:2)

与@NiklasB相似。上面的回答(复制了他的sort_by

arr.map(&:split).sort_by { |x,y| [-x.to_i, y] }

=> [["2", "a"], ["2", "c"], ["1", "a"], ["1", "b"]]

答案 2 :(得分:0)

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

    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