2014-05-13 80 views
2

假設我有一個陣列,即arr[1, 2, 3, 4, 8, 8],我想找到這個陣列中的所有最大的元素:找到一個數組的元素的所有最大

arr.allmax # => [8, 8] 

是否有一個內置的方法組合解決這個?我不喜歡猴子補丁,因爲我現在做的:

class Array 
    def allmax 
    max = self.max 
    self.select { |e| e == max } 
    end 
end 

猴子補丁是不是一個好主意,我可能只是做:

some_array.select { |e| e == some_array.max } 

,也將努力爲allmax。感謝所有靈感的答案和評論。

+0

爲什麼'map.compact'而不是'select'? –

+0

是'select'好多了,謝謝。 – juanitofatas

+0

'select {| e | e == max}' –

回答

1

這裏有一個有趣的方式來做到這一點。

arr.sort!.slice arr.index(arr[-1]) || 0..-1 

排序陣列,然後找到該陣列的最右邊的索引相匹配的陣列的最左邊的索引,並採取該範圍相匹配(該子切片或0 ..- 1的範圍內,如果數組爲空)。

這一個很有趣,因爲它不需要中間數組,但它確實會改變輸入來實現單線程。

+0

太酷了。千萬不要這樣想。謝謝,克里斯。 – juanitofatas

1

這裏有一種方法:

2.1.0 :006 > arr = [1, 2, 3, 4, 8, 8] 
=> [1, 2, 3, 4, 8, 8] 
2.1.0 :007 > arr.group_by { |i| i }.max.last 
=> [8, 8] 
2.1.0 :008 > 

這裏有一個方法: -

def all_max(arr) 
    return [] if arr.empty? 
    arr.group_by { |i| i }.max.last 
    end 
+0

失敗的空陣列... –

+0

@UriAgassi我會包裹在一個方法..給我一下 –

+0

很高興看到'group_by',我的問題是「不要猴子補丁」內置'Array',很簡單''group_by'沒問題,儘管它不能處理空白的情況。非常感謝,奧雅納! – juanitofatas

1

另一種方式:

def all_max(arr) 
    return [] if arr.empty? 
    mx = arr.max 
    [mx] * arr.count { |e| e == mx } 
end 

all_max([1, 2, 3, 4, 8, 8]) 
    #=> [8, 8] 

構建以單通道數組,你可以這樣做:

arr.each_with_object([]) do |e,a| 
    if a.empty? 
    a << e 
    else 
    case e <=> a.first 
    when 0 then a << e 
    when 1 then a.replace([e]) 
    end 
    end 
end 
+0

謝謝你的靈感,卡里! – juanitofatas

相關問題