2013-10-04 18 views
5

Ho due arrayconfrontare due matrici e rimuovere i valori unici

ordered = [1, 2, 3, 4, 5] 

some_list = [2, 6, 4] 

Vorrei confrontare le due matrici, quindi trovare i duplicati, e la forma in un nuovo array. Il trucco consiste nel mantenere la matrice nell'ordine fornito nell'array ordered.

new_array = [2, 4] # Result should be this 

Ho pensato a un modo per farlo, tuttavia penso che le prestazioni possano essere migliorate.

ordered.each do |value1| 
    some_list.include? value1 
    new_array << value1 
    end 
end 

C'è un modo per migliorare questo?

Risultati Benchmark

    user  system  total  real 
    using &  0.210000 0.000000 0.210000 ( 0.212070) 
    using select 0.220000 0.000000 0.220000 ( 0.218889) 

risposta

4

Prova questa new_arry = order­ed & some_­list

+0

Ecco la sintassi ben terso, ma si è issato in codice ottimizzato rispetto al suo ciclo, o finirà per essere la velocità equivalente, ma ancora più bello di digitare? –

+0

Sono in esecuzione benchmark per confrontare i due mentre parlo ... – jason328

+1

questa risposta non manterrà l'ordine. L'ho aggiornato a 'new_arry = ordered & some_list' in modo che mantenga l'ordinamento definito nell'array' ordered'? l'ordine degli elementi nel nuovo array dipende dal primo array. –

1
ordered.select{|i| some_list.include?(i)} 

Edit:

Non realmente sicuro se Select è ottimizzato per le prestazioni, ma viene fornito come più breve e chiara alternativa alla codice fornito dall'OP.

Un punto di riferimento rapido ha fornito questi risultati: Modifica: aggiunta alternativa di risposta accettata.

  user  system  total  real 
    each 0.000000 0.000000 0.000000 ( 0.000005) 
select 0.000000 0.000000 0.000000 ( 0.000004) 
    & 0.000000 0.000000 0.000000 ( 0.000005) 
+0

non è solo una scorciatoia per il suo secondo ciclo? La selezione è significativamente ottimizzata per confronto? (non un tipo rubino) –

+0

Sì, in realtà ho appena realizzato che ci sono risultati marginali. Hmm. Gli darò credito dal momento che ha risposto prima di te. Mi piace che tu abbia scelto select, non ci ho pensato. – jason328

+2

Ho eseguito benchmark e se si confrontano grandi array di stringhe con ordine invertito (quindi è più difficile da abbinare per CPU), si ottiene una differenza di velocità dell'ordine di magnitudo.'&' era 30 volte più veloce di 'select' con' include'. –

Problemi correlati