簡體   English   中英

在Ruby中不返回鍵值對數組數組的一種干凈的哈希排序方法是什么?

[英]What's a clean way to sort a hash in Ruby without returning an array of key-value pair arrays?

當我在Ruby中對哈希進行排序時,它將返回鍵值對數組的數組。

我希望它返回一個哈希。

有什么干凈的方法可以做到這一點? 注入?

哈希並不是真正可排序的對象。 從Ruby 1.9開始,它們按添加的順序維護密鑰,這很方便,但是就數據結構而言,順序無關緊要。

您可以通過比較{ a: 1, b: 2 } == { b: 2, a: 1 } #=> true 對於順序是重要特征的數組,情況並非如此。

您會發現Ruby中的許多方法實際上將散列轉換為可枚舉,它們更接近數組,因為它們具有已定義的順序。 sort等返回值時,將得到一個數組。

您可以使用Hash[...]輕松將其轉換回哈希:

Hash[hash.sort(...)]

您可以使用Hash#[]

h = {a: 1, b:0, c: 3}
arr = h.sort {|(_,v),(_, v2) | v <=> v2 }
h2 = Hash[arr] #=> {:b=>0, :a=>1, :c=>3}

請注意,這是可能的,因為哈希是根據Ruby中的插入順序枚舉的。 用其他語言散列通常不是這種情況

正如其他人所警告的那樣,通常依賴於哈希元素的順序並不是一種好習慣。

假設要對值進行排序,這是另一種方法:

h = {a: 2, b: 1, c: 4, d: 0}

Hash[h.to_a.sort_by(&:last)]
 # => {:d=>0, :b=>1, :a=>2, :c=>4} 

如果您希望有一個按其鍵本質上排序的關聯數組(而不是像建議的其他解決方案中那樣必須以正確的順序手動插入),則應該看看RBTree gem,它實現了一個紅黑樹。 。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM