【问题标题】:How to sort a mixed array by different elements in Ruby?如何在 Ruby 中按不同元素对混合数组进行排序?
【发布时间】:2011-12-30 21:34:12
【问题描述】:

我有一个类似这样的数组:

a = [
  [0, {:a=>"31", :b=>"21"}],
  [1, {:a=>"32", :b=>"11"}],
  [1, {:a=>"25", :b=>"19"}],
  [0, {:a=>"12", :b=>"10"}]
]

我想按每行的第一个元素或散列的各个元素(行中的第二个元素)对其进行排序。

【问题讨论】:

    标签: ruby-on-rails ruby arrays sorting hash


    【解决方案1】:
    a = [
      [0, {:a=>"31", :b=>"21"}],
      [1, {:a=>"32", :b=>"11"}],
      [1, {:a=>"25", :b=>"19"}],
      [0, {:a=>"12", :b=>"10"}]
    ]
    p a.sort_by{|el| [el.first, *el.last.values]}
    

    输出:

    => [[0, {:a=>"12", :b=>"10"}], 
        [0, {:a=>"31", :b=>"21"}], 
        [1, {:a=>"25", :b=>"19"}], 
        [1, {:a=>"32", :b=>"11"}]]
    

    【讨论】:

    • 这似乎根本没有排序
    • @UnixGuy 怎么没排序?它看起来对我来说是正确的:按第一个元素排序,然后是散列中的元素。
    • @Unix guy :它按数组的第一个元素排序(所以 0 在 1 之前);如果它们相同,则哈希的 key :a 的值决定谁先来,然后是 key :b 的值。 (在答案中添加了输出)。
    • 对不起,我的错!我会把它拿回来。 @steenslag 发布了“a”而不是发布结果,这令人困惑……为他的解决方案 +1!我还修复了他的输出格式
    【解决方案2】:

    按数组中的第一项排序:

    > a.sort_by{|x| x.first}
     => [[0, {:a=>"31", :b=>"21"}], 
         [0, {:a=>"12", :b=>"10"}], 
         [1, {:a=>"32", :b=>"11"}], 
         [1, {:a=>"25", :b=>"19"}]] 
    

    按哈希中的第一项排序:

    > a.sort_by{|x| x.last.first}
     => [[0, {:a=>"12", :b=>"10"}],
         [1, {:a=>"25", :b=>"19"}], 
         [0, {:a=>"31", :b=>"21"}], 
         [1, {:a=>"32", :b=>"11"}]] 
    

    或者您可以按给定的哈希键排序:

    > sort_key = :b
    > a.sort_by{|x| x.last[ sort_key ]}
     => [[0, {:a=>"12", :b=>"10"}],
         [1, {:a=>"32", :b=>"11"}],
         [1, {:a=>"25", :b=>"19"}],
         [0, {:a=>"31", :b=>"21"}]] 
    

    如果要按数组的第一个值排序,然后按哈希中的第一个条目,作为辅助搜索条件,答案是:

    > a.sort_by{|x| [x.first, x.last.first]}
     => [[0, {:a=>"12", :b=>"10"}], 
         [0, {:a=>"31", :b=>"21"}], 
         [1, {:a=>"25", :b=>"19"}], 
         [1, {:a=>"32", :b=>"11"}]] 
    

    【讨论】:

    • 请注意,“哈希中的第一个条目”仅适用于 Ruby 1.9。 ruby 1.8 中的哈希只有键,没有隐式顺序。
    • 通过“或”我的意思是排序它的方式:1)按每行的第一个元素 2)按散列中的第一个元素(它本身是行中的第二个元素)我刚刚在我的解决方案中添加了评论。它有效,但我想知道是否有更好的方法。
    【解决方案3】:

    嗯,我找到了自己问题的答案。请比较和评论。

    #sort by first item of each row (number)
    a.sort{|x,y| x[0] <=> y[0]}
    
    #sort by the first item in the hash
    a.sort{|x,y| x[1][:a] <=> y[1][:a]}
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-01-14
      • 1970-01-01
      • 2016-10-11
      • 2011-02-08
      • 2017-08-16
      • 1970-01-01
      • 2016-02-01
      相关资源
      最近更新 更多