【问题标题】:How to sort array of hashes by value?如何按值对哈希数组进行排序?
【发布时间】:2012-08-03 19:26:04
【问题描述】:

我正在尝试根据给定的键值对哈希数组进行排序,并将首先在数组顶部返回该值,然后是剩余数据。

例如:

students = [{name: "John Doe", age: 16, adviser: "Mrs. Robinson"},
            {name: "John Smith", age: 18, adviser: "Mrs. Williams"},
            {name: "Michael Rodriguez", age: 17, adviser: "Mr. Lee"}]

def sort_by_adviser(data, name)
  ...
end

> sort_by_adviser(students, "Mr. Lee")
=> [{name: "Michael Rodriguez", age: 17, adviser: "Mr. Lee"},
    {name: "John Doe", age: 16, adviser: "Mrs. Robinson"},
    {name: "John Smith", age: 18, adviser: "Mrs. Williams"}]

> sort_by_adviser(students, "Mrs. Williams")
=> [{name: "John Smith", age: 18, adviser: "Mrs. Williams"},
    {name: "Michael Rodriguez", age: 17, adviser: "Mr. Lee"},
    {name: "John Doe", age: 16, adviser: "Mrs. Robinson"}]

这里的输出将顾问的名字放在列表的顶部,然后是数组中的其他哈希值。

> sort_by_keyvalue(data, "Z")
=> [{letter: 'Z'},
    {letter: 'A'},
         .
         .
         .
    {letter: 'Y'}]

> sort_by_keyvalue(data, 5)
=> [{number: 5, value: 'value1'},
    {number: 5, value: 'value2'},
    {number: 5, value: 'value3'},
    {number: 9, value: 'value1'},
    {number: 9, value: 'value2'},
    {number: 8, value: 'value1'},
    {number: 8, value: 'value2'},
    {number: 7, value: 'value1'},
    {number: 6, value: 'value1'},
    {number: 4, value: 'value1'},
    {number: 3, value: 'value1'},
    {number: 2, value: 'value1'},
    {number: 1, value: 'value1'},
    {number: 1, value: 'value2'},
    {number: 0, value: 'value1'}]

有人知道怎么做吗?

【问题讨论】:

  • 您是要进行任何排序,还是只是将匹配的排序移到第一位?
  • 首先移动匹配的,然后做一个 sort_by { |k,v| k[:key] } 对数组中剩余的哈希进行排序。

标签: ruby arrays sorting hash


【解决方案1】:

另一个实现:)

def sort_by_adviser(data, name)
    data.each_with_index do |hash,index|
      if hash[:adviser]==name
         data.delete_at index #delete from array
         data.unshift hash
         break
      end
    end
   data
end

 > sort_by_adviser(students, "Mr. Lee")  
 #=> [{:name=>"Michael Rodriguez", :age=>17, :adviser=>"Mr. Lee"}, {:name=>"John Doe", :age=>16, :adviser=>"Mrs. Robinson"}, {:name=>"John Smith", :age=>18, :adviser=>"Mrs. Williams"}] 

【讨论】:

    【解决方案2】:
    def creamy_sort(key, value, arr)
      top, bottom = arr.partition{|e| e[key] == value }
      top.concat(bottom.sort{|a,b| b[key] <=> a[key]})
    end
    
    creamy_sort(:adviser, "Mr. Lee", students)
    

    【讨论】:

      【解决方案3】:

      你可以这样做:

      def sort_by_adviser(data, name)
        data = data.sort{|x,y|x[:adviser] <=> y[:adviser]}
        i = data.index{|h|h[:adviser] = name}
        h = data.delete_at i
        data.unshift h
      end
      

      【讨论】:

        【解决方案4】:

        我有这个解决方案:

        students = [{name: "John Doe", age: 16, adviser: "Mrs. Robinson"},
                    {name: "John Smith", age: 18, adviser: "Mrs. Williams"},
                    {name: "Michael Rodriguez", age: 17, adviser: "Mr. Lee"}]
        
        def sort_by_adviser(data, *name)
          data.sort_by{| entry |    
            [ 
              name.index(entry[:adviser]) || 999,
              entry[:age], entry[:name] #2nd sort criteria
            ]
          }
        end
        
        p sort_by_adviser(students, "Mr. Lee")
        #[{:name=>"Michael Rodriguez", :age=>17, :adviser=>"Mr. Lee"}, {:name=>"John Doe", :age=>16, :adviser=>"Mrs. Robinson"}, {:name=>"John Smith", :age=>18, :adviser=>"Mrs. Williams"}]
        
        p sort_by_adviser(students, "Mrs. Williams")
        # [{:name=>"John Smith", :age=>18, :adviser=>"Mrs. Williams"}, {:name=>"John Doe", :age=>16, :adviser=>"Mrs. Robinson"}, {:name=>"Michael Rodriguez", :age=>17, :adviser=>"Mr. Lee"}]
        

        没看懂,剩下的条目是怎么排序的。

        您写道:然后是剩余数据。哈希的顺序标准是什么?

        我选择了年龄,然后是姓名。但您可以根据需要对其进行调整。

        【讨论】:

          【解决方案5】:
          def weird_sort(array, key, value)
            return array.sort_by{|d| 2 <=> (d[key] == value).object_id}
          end
          

          这是基于 true.object_id 在 ruby​​ 中等于 2 的事实。 一种奇怪的解决方案,这就是为什么它是 weird_sort :p 它还扰乱了其他值排序......所以它只保证你的值相等!

          【讨论】:

            猜你喜欢
            • 2011-03-10
            • 1970-01-01
            • 2020-04-05
            • 1970-01-01
            • 2011-02-02
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2020-10-14
            相关资源
            最近更新 更多