簡體   English   中英

對數組進行排序並將計數器存儲在 Ruby 中的另一個數組中

[英]Sort an array and store the counters in another array in Ruby

我目前正在使用以下代碼對 Ruby 中的 arrays (數字)數組進行排序:

grapes_sorted = vintages_grapes.group_by(&:itself).sort_by do |k, v| -v.size end.map(&:first) 

它工作得很好。 但是,我想將與每個排序對應的計數器存儲在另一個數組中。

我試過了:

grapes_sorted_counters = []
grapes_sorted = vintages_grapes.group_by(&:itself).sort_by do |k, v| 
                        -v.size 
                        grapes_sorted_counters << v.size 
                    end.map(&:first) 

它存儲計數器,但是,排序已損壞,沒有按應有的順序排列。 我想v.size(而不是-v.size)是塊中問題的原因。

如何在grapes_sorted_counters []中正確存儲出現次數? 謝謝。

我相信您的代碼的問題已被確定,因此我將建議一種替代方法。

grapes = %w|red blue red green yellow red blue blue green red|
  #> ["red", "blue", "red", "green", "yellow", "red", "blue",
  #   "blue", "green", "red"]

grapes.tally.sort_by { |_,count| -count }.map(&:first)
  #=> ["red", "blue", "green", "yellow"]

請參閱Enumerable#tally

步驟如下。

h = grapes.tally
  #=> {"red"=>4, "blue"=>3, "green"=>2, "yellow"=>1} 
a = h.sort_by { |_,count| -count }
  #=> [["red", 4], ["blue", 3], ["green", 2], ["yellow", 1]] 
a.map(&:first)
  #=> ["red", "blue", "green", "yellow"] 

是這部分讓你搞砸了:

sort_by do |k, v| 
  -v.size 
  grapes_sorted_counters << v.size 
end

您正在嘗試按-v.size排序。 但是該塊的返回值grapes_sorted_counters << v.size

所以只需切換這些行的順序。

我認為無論如何你的排序都有錯誤。

我目前正在使用以下代碼對 Ruby 中的 arrays (數字)數組進行排序:

我假設輸入值是這樣的

vintages_grapes = [[3,2], [3,2,1], [3]]

所以在第一步你做一個group_by

vintages_grapes.group_by(&:itself)
# -> {[3, 2]=>[[3, 2]], [3, 2, 1]=>[[3, 2, 1]], [3]=>[[3]]}

您可以看到這些值都嵌套在另一個數組[]中(它們的大小都為 1)。

sort_by do |key, value| 
  -value.size # size 1 for all values
end

group_by 不應該是必要的,你可以這樣做

result = []
vintages_grapes.sort_by do |array| 
  result << array.size
  result.sort!
  -array.size
end

我很好奇你認為-v.size在做什么。 – 鐵皮人 39 分鍾前
它首先按最大值對計數器進行排序。

這不是sortsort_by的工作方式。 兩者都依賴於塊返回的值來指示如何對值進行排序。

這個例子更像你的代碼,你嘗試否定size的值,然后返回數組。 這將導致升序排序:

foo = [1, 3, 2, 4]
foo.sort_by { |i| 
  -i
   i
 }
 # => [1, 2, 3, 4]

如果將否定值返回到塊,則結果使用降序:

 foo.sort_by { |i| 
  i
  -i
 }
 # => [4, 3, 2, 1]

您的代碼正在執行此操作:

 bar = []
 foo.sort_by { |i|
  -i
  bar << i
}
# => [1, 3, 2, 4]

這導致bar具有原始順序,因為它的填充順序與它們在foo中存在的順序相同,然后您將其傳遞給map 而且,在排序塊內分配總是會這樣做。 您希望該塊關閉並且 Ruby 已返回有序值之后執行此操作。

話雖如此, sort_by是錯誤的使用方法,您應該改用sort 為什么在 Ruby 的sort_by文檔中進行了解釋,因此請在此處查找更多信息。

此外,最好使用reverse方法來反轉順序,而不是通過否定值。 請參閱“ 如何在 Ruby 中對數組進行降序排序”。

暫無
暫無

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

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