![](/img/trans.png)
[英]How to authenticate users using rubycas-server with multi-field?
[英]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
所有元素(哈希)都具有相同的鍵; A
, B
和C
旨在作為文字(例如字符串或符號),因此我將它們更改為"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_by
對arr[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.