假設您需要獲取陣列中具有最大值的所有元素。
一種可能的方法是sort使用陣列然后使用Enumerable#take_while:
array = [ 1, 3, 2, 3, 2, 3 ].sort {|a,b| b - a}
array.take_while { |e| e == array[0] }
#=> [3, 3, 3]
現在,當您漂亮地鏈接方法并且不想僅僅為了存盤已排序的陣列(您需要參考take_while塊中的第一個元素)而停止鏈時,您會怎么做?
我在下面發布了問題和答案以供參考,但我可能錯過了更好的方法,因此請隨時發布您自己的方法
uj5u.com熱心網友回復:
紅寶石 < 2.5
- 我對這個問題的原始回答:
sort。slice_when.first
[ 1, 3, 2, 3, 2, 3 ].sort {|a,b| b - a}.slice_when {|a,b| b != a}.first
#=> [3, 3, 3]
注意:當slice_when回傳一個 時Enumerator,這個解決方案不會遍歷所有已排序的陣列first。在強硬之下有一個更高效的解決方案。
紅寶石 >= 2.5
- 結合@engineersmnky 和@Cary 方法:
then和maxselect
[ 1, 3, 2, 3, 2, 3 ].then { |arr| mx = arr.max; arr.select { |elm| elm == mx } }
#=> [3, 3, 3]
uj5u.com熱心網友回復:
其它的辦法:
arr = [ 1, 3, 2, 3, 2, 3 ]
arr.sort {|a,b| b - a}.tap { |arr| arr.select! { |e| e == arr.first } }
#=> [3, 3, 3]
請注意,這arr不是突變。
uj5u.com熱心網友回復:
你可以試試這個
pry(main)> [ 1, 2, 2, 3, 3, 3 ].sort.slice_when {|a,b| b > a}.to_a.last
=> [3, 3, 3]
與上一個解決方案有點相似,但也不同。
來源https://ruby-doc.org/core-3.0.2/Enumerable.html#method-i-slice_when
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/358262.html
