簡體   English   中英

為什么我們可以在塊中使用數組索引來在ruby中進行哈希排序?

[英]Why can we use array indexing in the block to hash sort in ruby?

我可以對下面的哈希進行排序:

h = {"a"=> 20, "b"=> 30 , "c" => 25}

通過使用這個:

h.sort { |a, b| b[1] <=> a[1] }

但是,我不明白為什么或如何使用此代碼。 |a, b| ab表示的值是什么 它們來自哪里?

sort方法的文檔對這些問題保持沉默。

Hash類從Enumerable模塊繼承其sort方法。 可枚舉狀態的文檔:

Enumerable mixin為集合類提供了多種遍歷和搜索方法,並具有排序功能。 該類必須提供each方法,它產生集合的連續成員。

所以對方法的實現Enumerable依靠each類的方法Enumerable被包括在具體的,它預期each將產生對象表示集合的成員。 在這種情況下, Hash#each的文檔都說:

each {| key, value | block } → hsh

對hsh中的每個鍵調用一次,將鍵值對作為參數傳遞。

由於Hash#each產量key, value在散列每個鍵-值對,在這些方法中Enumerable假定key, value是一個在基礎散列(在某種意義上說,它是)“集合的成員”。 因此, Enumerable#sort產生key, valuea ,和不同的key, valueb ,因為Enumerable#sort是依靠由得到的值Hash#each其實施。 這就是你的例子中ab的來源。

Hash從Enumerable模塊中獲取其sort方法,其中記錄為返回數組。

如果要以特定順序訪問哈希值,則對哈希進行排序,允許Ruby將其轉換為數組數組,並使用這些數據以所需順序提取值及其關聯鍵:

h = {"a"=> 20, "b"=> 30 , "c" => 25}
sorted_values = h.sort_by{ |k,v| v } # => [["a", 20], ["c", 25], ["b", 30]]
sorted_values.each do |k, v|
  puts "#{v} <= #{k}"
end
# >> 20 <= a
# >> 25 <= c
# >> 30 <= b

為什么Ruby將哈希鍵/值對轉換為子數組對我來說很有意義。 我曾經想過要對哈希進行排序的唯一原因是以特定順序訪問值並保留子數組所做的鍵和值的映射。

注意:我正在使用sort_by因為在挖掘結構或計算中間排序值而不是sort時,它更快。 這個特殊的用例可能不是最好的例子,因為哈希非常簡單,但是我的大多數現實例子最終都不得不深入sort_by相當深的和sort_by規則。

這些都記錄在哪里? 事實並非如此。 Hash的文檔沒有提到繼承自Enumerable的sortsort_by 有關sortsort_by Enumerable文檔雖然很好,但僅指的是對Array進行排序的情況。 學習哈希被分解為鍵/值對然后傳入來自經驗,它應該被記錄,現在可以是你承擔的任務。 暗示。 暗示。

Enumerable模塊的文檔提到:

該類必須提供每個方法,它產生集合的連續成員。

如果我們在沒有塊的散列上調用它們,則會產生一個Enumerator對象。 通過調用next來給出的連續值是鍵值對的數組。

h = {"a"=> 10, "b"=> 20, "c"=> 30}
h_enum = h.each
p h_enum.next  #=> ["a", 10]
p h_enum.next  #=> ["b", 20]

sort方法適用於這些對象,因此我們可以使用像[1]和b [1]這樣的術語進行比較

暫無
暫無

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

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