assumendo Ho il seguente array:Rubino enumerabile inverso rilevare
views = [
{ :user_id => 1, :viewed_at => '2012-06-29 17:03:28 -0400' },
{ :user_id => 1, :viewed_at => '2012-06-29 17:04:28 -0400' },
{ :user_id => 2, :viewed_at => '2012-06-29 17:05:28 -0400' },
{ :user_id => 3, :viewed_at => '2012-06-29 17:06:28 -0400' },
{ :user_id => 1, :viewed_at => '2012-06-29 17:07:28 -0400' },
{ :user_id => 1, :viewed_at => '2012-06-29 17:08:28 -0400' },
{ :user_id => 3, :viewed_at => '2012-06-29 17:09:28 -0400' },
{ :user_id => 3, :viewed_at => '2012-06-29 17:16:28 -0400' },
{ :user_id => 3, :viewed_at => '2012-06-29 17:26:28 -0400' },
{ :user_id => 3, :viewed_at => '2012-06-29 17:36:28 -0400' },
{ :user_id => 1, :viewed_at => '2012-06-29 17:47:28 -0400' },
{ :user_id => 2, :viewed_at => '2012-06-29 17:57:28 -0400' },
{ :user_id => 3, :viewed_at => '2012-06-29 17:67:28 -0400' },
{ :user_id => 1, :viewed_at => '2012-06-29 17:77:28 -0400' }
]
assumendo l'array è ordinato da viewed_at
Se voglio recuperare l'ultima vista hash nei viste array per un particolare user_id, potrei fare quanto segue:
views.reverse.detect { |view| view[:user_id] == 1 }
dove rileva restituisce il primo elemento in una enumerazione in cui il blocco restituisce true.
La mia domanda è: suppongo ci sia il costo O(n)
al metodo inverso, quindi come posso rilevare al contrario senza dover invertire l'array? Oppure il metodo inverso non è O(n)
?
Hai davvero '17: 77' come un tempo? –
Quando si concatenano i metodi, si desidera sempre concatenare gli enumeratori. La catena di enumerazione esegue una volta sola l'oggetto ed è O (n). L'esempio più comune è '" ciao ".each_char.map {| x | x.succ}' – texasbruce
@texasbruce: questo sarà completamente vero con Ruby 2.0, dove saranno possibili tutti i tipi di operazioni lazy (ora molte operazioni restituiscono array, non enumeratori) – tokland