簡體   English   中英

如何按多字段對紅寶石中的數組進行排序

[英]how to sort array in ruby by multi-field

我有一個像這樣的數組:

-  
        {"name"=>“A”, "10"=>30, "2" =>40, "90"=>0}
        {"name"=>“B”, "10"=>20, "2" =>40, "90"=>0}
        {"name"=>“C”, "10"=>20, "2" =>40, "90"=>10}

---

我想首先按最高鍵(90)進行排序:

- 
        {"name"=>"C", "10"=>20, "2" =>40, "90"=>10}
        {"name"=>"A", "10"=>30, "2" =>40, "90"=>0}
        {"name"=>"B", "10"=>20, "2" =>40, "90"=>0}

然后按下一個更高的鍵(按數字順序10)排序:

- 
        {"name"=>"C", "10"=>20, "2" =>40, "90"=>10}
        {"name"=>"A", "10"=>30, "2" =>40, "90"=>0}
        {"name"=>"B", "10"=>20, "2" =>40, "90"=>0}

然后按下一個更高的鍵2排序:

如何在紅寶石中實現它?

---

更新:

鍵沒有定義,例如,可以是50、10,2。 但是它會從最高到最低排序。

我知道鍵是否已定義(例如):

a = [{:x=>3,:y=>2,:z=>1},{:x=>3,:y=>1,:z=>3},{:x=>1,:y=>3,:z=>2}]

a.sort_by do |p|
    [p[:x],p[:z]]

結束

我們可以這樣做,但是對於如果鍵未定義該怎么辦(例如,我可以在排序內進行迭代嗎?)感到困惑

因此,總的來說,我想按從最高到最低的所有數值進行排序。

我認為

  • 如示例中所示, arr所有元素(哈希)都具有相同的鍵;
  • ABC旨在作為文字(例如字符串或符號),因此我將它們更改為"A""B""C"
  • 用“ ...按最高鍵...”的意思是“ ...用除'name'以外的鍵,該鍵在轉換為整數后最大...”。 10 > 2 #=> true"10" > "2" #=> false

因此,數組如下。

arr = [{ "name"=>"A", "10"=>30, "2" =>40, "90"=>0 },
       { "name"=>"B", "10"=>20, "2" =>40, "90"=>0 },
       { "name"=>"C", "10"=>20, "2" =>40, "90"=>10 }]

這是執行排序的一種方法。

keys = (arr.first.keys - ["name"]).sort_by(&:to_i).reverse
  #=> ["90", "10", "2"]
arr.sort_by { |h| h.values_at(*keys) }
  #=> [{"name"=>"B", "10"=>20, "2"=>40, "90"=>0},
  #    {"name"=>"A", "10"=>30, "2"=>40, "90"=>0},
  #    {"name"=>"C", "10"=>20, "2"=>40, "90"=>10}]

舉例來說, sort_byarr[0]的塊計算為

{ "name"=>"A", "10"=>30, "2" =>40, "90"=>0 }.values_at(*keys)
  #=> { "name"=>"A", "10"=>30, "2" =>40, "90"=>0 }.values_at("90", "10",  "2") 
  #=> [0, 30, 40]

有關如何比較相同大小的數組的說明,請參見Array#<=> (第3段)。 另請參見Enumerable#sort_by

是的,您可以在sort_by進行迭代:

# first sort the arbitrary integer keys in reverse order (assuming those keys will be same across all hashes)
keys = a[0].
         keys. # ["name", "10", "2", "90"]
         select { |k| k.match?(/^\d+$/) }. # this will basically keep only the integer valued strings: ["10", "2", "90"]
         sort_by(&:to_i). # this will sort them by their integer values: ["2", "10", "90"]
         reverse # ["90", "10", "2"]: this is the order by which you want to sort the hashes

# now use this ordered `keys` to sort the hashes by corresponding values
a.sort_by { |p| keys.map { |x| p[x] } }.reverse

暫無
暫無

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

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