2011-12-17 67 views

回答

12

簡單:你做

array.sort[-2] 

而且:)

+1

這不是一個單一的迭代:) – Jan 2011-12-17 11:36:26

+0

數組中的值是動態填充的。所以我們不知道數組中的值。在這種情況下,我們將如何迭代並找到第二大值 – rubyist 2011-12-17 11:38:33

+1

如果您不知道哪種對象存在並且無法排序,則無法知道最大值是多少。您的對象必須定義某種順序,最好的解決方案是實現** <=> **方法幷包含** Comparable **模塊。 – 2011-12-17 11:41:30

2

sort可能是矯枉過正這裏,特別是對於真正的大陣列。不太明白「單一迭代」,你的意思是?

a = [3,6,774,24,56,2,64,56,34] 
b = a.shift(2).sort 
c = 
    a.inject(b) do |(m2, m), e| 
    case 
    when e > m 
     [m, e] 
    when e > m2 
     [e, m] 
    else 
     [m2, m] 
    end 
    end 
c.first #=> 64 
+1

我猜OP的意思是O(n)。 – Jan 2011-12-17 14:56:54

+0

我只是在學習ruby。那麼這個m2,m和e包含什麼值?我從教程中瞭解到,e將包含數組中每個元素的值..但(m2,m)有點令人困惑...... – rubyist 2011-12-17 16:07:06

+1

如果您通過'[a,b],c'來調用解構塊| do |(x,y),z | ...結束,然後'a - > x,b - > y,c - > z'。在我的代碼中''b''是一個像'[a,b]'這樣的兩個元素數組(因爲塊也返回了兩個元素數組,所以它會在下一步中進行備忘)。 – 2011-12-17 16:31:55

1

只是爲了好玩,此方法在一個枚舉的第N個最大的價值(你會使用對開模塊,以使插入acc更有效)。正如@Victor所指出的那樣,當數組的長度比n大得多時,你只能使用它,另外一個簡單的array.sort[-n]更快。

module Enumerable 
    def max_nth(n) 
    inject([]) do |acc, x| 
     (acc + [x]).sort[[acc.size-(n-1), 0].max..-1] 
    end.first 
    end 
end 

p [1, 5, 2, 32, 2, 41, 15, 55].max_nth(2) #=> 41 
+0

我也有這個想法,但這裏有一個皺紋。當n <<數組大小時它可能工作正常,但在其他情況下'sort'可以更好地工作。所以當你說「通用」時,這有點誤導。 – 2011-12-18 00:32:54

+0

@維克多。的確,這更適合n << array_size。但我認爲,在實際情況下,情況就是如此。無論如何,它比使用條件代碼少。 – tokland 2011-12-18 09:35:49

1

這工作,但我不知道對於 「單次迭代」

a.max(2)[1]

0

它也能工作:

arr.sort.reverse[1]