[英]Order Hash and delete first key-value pair
我有一個帶時間戳的哈希作為鍵。
hash = {
"2016-05-31T22:30:58+02:00" => {
"path" => "/",
"method" => "GET"
},
"2016-05-31T22:31:23+02:00" => {
"path" => "/tour",
"method" => "GET"
},
"2016-05-31T22:31:05+02:00" => {
"path" => "/contact_us",
"method" => "GET"
}
}
我訂購了這個系列並獲得了第一對,如下所示:
hash.sort_by {|k, _| k}.first.first
但是我該如何刪除它?
delete
方法要求您知道密鑰的exakt拼寫。 當然我可以返回密鑰然后在delete
方法中使用它,但我在想是否還有更直接的方法?
您正在尋找的方法是hash.keys
它返回鍵的數組:
hash.delete(hash.keys.min)
編輯 :我已經更新了答案,以反映必須首先對密鑰進行排序,這已添加到原始問題中,並由@Shadwell在本文的評論中提出。
我hash.keys.sort.first
hash.keys.min
建議替換hash.keys.sort.first
為hash.keys.min
,它不僅性能更高,而且語義更好。
另請注意,可以對哈希值使用shift
。
hash.shift
從哈希中刪除第一個鍵值對。 也適用於數組。
由於OP沒有聲明哈希的鍵是按排序順序排列的,我們必須假設它們不能保證。
hash = { "2016-05-31T22:31:05+02:00"=>{ "path"=>"/tour", "method"=>"GET" },
"2016-05-31T22:30:58+02:00"=>{ "path"=>"/", "method"=>"GET" },
"2016-05-31T22:31:23+02:00"=>{ "path"=>"/contact_us", "method"=>"GET" } }
首先,找到最小的鍵(第二個):
smallest_key = hash.keys.min
#=> "2016-05-31T22:30:58+02:00"
這顯然比排序密鑰然后采取最小的更有效。
因為日期時間字符串是iso8601格式,所以它們可以按字符串排序,而不必先將它們轉換為time
對象。
然后使用Hash#reject獲取所需的哈希值:
hash.reject { |k,_| k == smallest_key }
#=> {"2016-05-31T22:31:05+02:00"=>{"path"=>"/tour", "method"=>"GET"},
# "2016-05-31T22:31:23+02:00"=>{"path"=>"/contact_us", "method"=>"GET"}}
要在適當的位置更改hash
,請寫入
hash.delete(smallest_key }
hash
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.