[英]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 分鍾前
它首先按最大值對計數器進行排序。
這不是sort
或sort_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.