簡體   English   中英

困惑於如何對紅寶石中的對象進行排序

[英]Confused on how to sort an array of objects in ruby

我對紅寶石比較陌生。 我有一個稱為claims的數組。 claims數組中的每個元素都是一個Claim。 如果我確實claims[0].housesclaims[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 }

查看文檔sort_by!


我沒有測試過任何一個,因此如果您遇到任何問題或有任何其他問題,請隨時發表評論

根據您的示例,我進行了演示以進行排序。

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.

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