【问题标题】:Ruby Custom SortingRuby 自定义排序
【发布时间】:2015-07-25 10:24:39
【问题描述】:

我在 Ruby 中有以下数组。

arr = [
[13.0, ["mango", "banana", "jackfruit"]], 
[10.0, ["mango", "Milk", "Cofee"]], 
[4.0, ["mango"]]
[5.0, ["jackfruit"]], 
[6.0, ["mango", "banana"]], 
[5.0, ["mango", "banana"]], 
[10.0, ["banana", "jackfruit"]], 
[5.0, ["banana"]], 
]

我希望结果按以下规则排序:

  1. 首先按 Fruit 数组长度排序(如何分组)
  2. 按价格从低到高排序。

预期输出:

[
[10.0, ["mango", "Milk", "Cofee"]], 
[13.0, ["mango", "banana", "jackfruit"]], 

[5.0, ["mango", "banana"]], 
[6.0, ["mango", "banana"]], 
[10.0, ["banana", "jackfruit"]], 

[4.0, ["mango"]]
[5.0, ["jackfruit"]], 
[5.0, ["banana"]], 
]

说明:首先按水果数组长度对元素进行分类,然后在每个集合上根据它们的价格(低-高)进行排序。

我尝试了以下代码,但没有给出想要的结果!

arr.group_by{|x| x[1].length }.sort_by{|x| x[0]}.map{|x| x[1]}

【问题讨论】:

    标签: ruby sorting enumerable


    【解决方案1】:

    您不需要进行任何特殊的分组。

    arr.sort {|a, b| (b[1].length <=> a[1].length) * 10 + (a[0] <=> b[0]) }
    

    结果:

    [
      [10.0, ["mango", "Milk", "Cofee"]],
      [13.0, ["mango", "banana", "jackfruit"]],
      [5.0, ["mango", "banana"]],
      [6.0, ["mango", "banana"]],
      [10.0, ["banana", "jackfruit"]],
      [4.0, ["mango"]],
      [5.0, ["jackfruit"]],
      [5.0, ["banana"]]
    ]
    

    #sort 传递要比较的值。 &lt;=&gt; 返回 -1、0 或 1,具体取决于它们的比较方式,因此,由于您希望优先考虑长度而不是价格,因此每个项目的“排序权重”可以是(长度比较 * 10)+(价格比较)。

    【讨论】:

      【解决方案2】:

      这里不需要过于聪明的比较器,你是按数字排序的,所以简单的否定可以反转排序,sort_by 可以处理其余的事情。例如:

      arr.sort_by { |e| [-e.last.length, e.first] }
      

      或者如果您更喜欢数字索引:

      arr.sort_by { |e| [-e[1].length, e[0]] }
      

      会给你:

      [
        [10.0, ["mango", "Milk", "Cofee"]],
        [13.0, ["mango", "banana", "jackfruit"]],
        [ 5.0, ["mango", "banana"]],
        [ 6.0, ["mango", "banana"]],
        [10.0, ["banana", "jackfruit"]],
        [ 4.0, ["mango"]],
        [ 5.0, ["jackfruit"]],
        [ 5.0, ["banana"]]
      ]
      

      根据需要。 Array#&lt;=&gt; 逐个元素进行比较,因此 sort_by 与产生数组的块相当常见。

      您可能希望在比较中添加更多条件,但您无法保证[11.0, ['a', 'b', 'c']][11.0, ['x', 'y', 'z']] 会出现在什么顺序中。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-09-10
        • 2014-07-18
        • 2011-12-16
        相关资源
        最近更新 更多