[英]Confused on how to sort an array of objects in ruby
我對紅寶石比較陌生。 我有一個稱為claims
的數組。 claims
數組中的每個元素都是一個Claim。 如果我確實claims[0].houses
, claims[0].houses
得到一系列房屋。 我有兩件事很困惑。
首先是當我在控制台中鍵入claims[0]
時,我實際上看不到house屬性,但是當我claims[0].houses
我看到了我的房屋數組。 房屋是索賠對象的財產嗎?
我的第二個問題是關於對claims
數組進行排序。 每個house
都有一個價格屬性。 所以我的數據結構如下所示:
Claim[0] Claim[1] Claim[2]
house[0]: house[0]: house[2]
price: 20 price: 24 price: 11
house[1]: house[1]: house[2]:
price: 17 price 30 price: 28
我想做的是按照最便宜的房屋對我的債權進行排序,因此claims
的第0個索引應具有帶有最便宜房屋的houses
陣列。 claims
數組的第一個索引應具有houses
數組,其第二便宜的房子如下所示:
Claim[0] Claim[1] Claim[2]
house[0]: house[0]: house[2]
price: 11 price: 20 price: 24
house[1]: house[1]: house[2]:
price: 28 price 17 price: 30
為了解釋我如何得到上面的結果,我發現Claim[2]
中的houses
數組具有最便宜的房子,為11。因此,進入了Claim[0]
。 然后,我發現在其余未分類的houses
中,最初屬於Claim[0]
的房屋中最便宜的房屋是17,因此它進入了Claim[1]
。
我真的不知道如何在紅寶石中做到這一點。
我嘗試了很多事情,包括:
claims.sort!{|a,b| a.price.min <=> b.price.min}
但是我收到一個錯誤,提示undefined method price for #<Claim:0x0000010>
所以我嘗試了
claims.sort!{|a, b| a.house.price.min <=> a.house.price.min}
再次出現錯誤,指出undefined method price for #<Array:0x00000e7b>
有關如何執行此操作的任何想法?
您可以像這樣緊湊地進行操作:
claims.sort_by! { |claim| claim.houses.map{|h| h.price}.min}
起初這似乎效率低下,但實際上並不是因為sort_by的實現方式 。
您也可以分兩個步驟進行操作-這種方式可能會更慢,具體取決於程序的詳細信息。
首先,按價格對每組房屋進行排序:
claims.each do |claim|
claim.houses.sort_by! { |house| house.price }
end
現在,我們知道每個索賠中的第一座房屋是該索賠中最便宜的。 然后,我對索賠進行排序:
claims.sort_by! { |claim| claim.houses.first.price }
我沒有測試過任何一個,因此如果您遇到任何問題或有任何其他問題,請隨時發表評論
根據您的示例,我進行了演示以進行排序。
claims = [
{houses: [{price: 20},{price: 17}]},
{houses: [{price: 24},{price: 30}]},
{houses: [{price: 11},{price: 28}]} ]
claims.sort{|x,y| x[:houses].map{|h| h[:price]}.min <=> y[:houses].map{|h| h[:price]}.min}
=> [{:houses=>[{:price=>11}, {:price=>28}]},
{:houses=>[{:price=>20}, {:price=>17}]},
{:houses=>[{:price=>24}, {:price=>30}]}]
結果就是您想要的。
但是,如果我使用數組和哈希代替對象,則可以使用x.houses
代替x[:houses]
和h.price
代替h[:price]
。
並且,如果在Claim對象中添加min_price方法,效果會更好。
Class Claim
def min_price
houses.map{|h| h.price}.min
end
end
claims.sort{|x,y| x.min_price <=> y.min_price}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.