【问题标题】:Ruby 1.8: Hash#sort not return hash but array (better way to do this?)Ruby 1.8:Hash#sort 不返回散列而是返回数组(更好的方法?)
【发布时间】:2010-10-04 02:23:37
【问题描述】:

在 Ruby 1.8 的某些场景中。如果我有一个哈希

# k is name, v is order
foo = { "Jim" => 1, "bar" => 1, "joe" => 2}
sorted_by_values = foo.sort {|a, b| a[1] <==> b[1]}
#sorted_by_values is an array of array, it's no longer a hash!
sorted_by_values.keys.join ',' 

我的解决方法是为 Array 类创建方法 to_hash

class Array
  def to_hash(&block)
    Hash[*self.collect { |k, v|
      [k, v]
    }.flatten]
  end
end

然后我可以执行以下操作:

sorted_by_values.to_hash.keys.join ','

有没有更好的方法来做到这一点?

【问题讨论】:

    标签: ruby hash ruby-1.8


    【解决方案1】:

    哈希根据定义是无序的。不可能有排序哈希之类的东西。您最好的选择可能是使用 collect 从排序数组中提取键,然后对结果进行连接

    sortedByValues = foo.sort {|a, b| a[1] <==> b[1]}
    sortedByValues.collect { |a| a[0] }.join ','
    

    【讨论】:

    • 请注意,在 Ruby 1.9 中哈希是按键插入顺序排序的。
    • 不要依赖 1.9 中的键插入顺序,这不是一个定义,它是一个实现特性。如果您的代码适用于 (Matz)Ruby 但不适用于 jRuby,那么您知道我的意思 :)
    • @Fu86:不,这是语言的一个特性(由 Matz 确认)。参见 Hash 文档简介:ruby-doc.org/core/classes/Hash.html
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-02
    • 2022-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多