这是对哈希进行排序并返回hash对象(而不是Array)的最佳方法吗?

h = {"a"=>1, "c"=>3, "b"=>2, "d"=>4}
# => {"a"=>1, "c"=>3, "b"=>2, "d"=>4}

Hash[h.sort]
# => {"a"=>1, "b"=>2, "c"=>3, "d"=>4}

当前回答

我喜欢之前帖子中的解决方案。

我做了一个迷你类,叫它class AlphabeticalHash。它还有一个叫做ap的方法,它接受一个参数,一个Hash,作为输入:ap变量。类似于pp (pp变量)

但它将(试着)按字母顺序打印(它的键)。不知道是否有人想使用这个,它是一个gem,你可以这样安装它:gem install alphabetical_hash

对我来说,这很简单。如果其他人需要更多的功能,让 我知道,我会把它加进宝石里的。

编辑:这要归功于彼得,是他给了我这个想法。:)

其他回答

@ordered = {}
@unordered.keys.sort.each do |key|
  @ordered[key] = @unordered[key]
end

按键排序哈希,在Ruby中返回哈希

与解构和哈希#排序

hash.sort { |(ak, _), (bk, _)| ak <=> bk }.to_h

可列举的# sort_by

hash.sort_by { |k, v| k }.to_h

使用默认行为进行哈希排序

h = { "b" => 2, "c" => 1, "a" => 3  }
h.sort         # e.g. ["a", 20] <=> ["b", 30]
hash.sort.to_h #=> { "a" => 3, "b" => 2, "c" => 1 }

注意:< Ruby 2.1

array = [["key", "value"]] 
hash  = Hash[array]
hash #=> {"key"=>"value"}

注:> Ruby 2.1

[["key", "value"]].to_h #=> {"key"=>"value"}

我喜欢之前帖子中的解决方案。

我做了一个迷你类,叫它class AlphabeticalHash。它还有一个叫做ap的方法,它接受一个参数,一个Hash,作为输入:ap变量。类似于pp (pp变量)

但它将(试着)按字母顺序打印(它的键)。不知道是否有人想使用这个,它是一个gem,你可以这样安装它:gem install alphabetical_hash

对我来说,这很简单。如果其他人需要更多的功能,让 我知道,我会把它加进宝石里的。

编辑:这要归功于彼得,是他给了我这个想法。:)

如果你不想使用ruby 1.9.2或使用你自己的变通方法,ActiveSupport::OrderedHash是另一个选择。

我借用Boris Stitnicky的灵感解决方案来修补一个就地排序!方法:

def sort!
  keys.sort!.each { |k| store k, delete(k) }
  self
end