2013-10-04 12 views
5

Mam dwie tablicePorównaj dwie tablice i Usuń unikatowych wartości

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

some_list = [2, 6, 4] 

chciałbym porównać dwie tablice, a następnie znaleźć duplikaty, a tworzą go do nowej tablicy. Sztuką jest utrzymanie tablicy w kolejności podanej w tablicy ordered.

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

Pomyślałem o jednym sposobie na to, jednak myślę, że wydajność można poprawić.

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

Czy mogę to poprawić?

Wyniki testów

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

Odpowiedz

4

Spróbuj new_arry = order­ed & some_­list

+0

To ładnie składnia lakoniczny, ale jest ona podniesiona do zoptymalizowanego kodu w porównaniu do jego pętli, czy będzie to w końcu jest równoważna prędkość ale jeszcze ładniejszy wpisać? –

+0

Używam testów porównawczych do porównywania dwóch, jak mówię ... – jason328

+1

ta odpowiedź nie będzie utrzymywać porządku. Zaktualizowałem go do 'new_arry = ordered & some_list', dzięki czemu zachowuje uporządkowaną kolejność zdefiniowaną w tablicy' ordered'? kolejność elementów w nowej tablicy zależy od pierwszej tablicy. –

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

EDIT:

Naprawdę nie jestem pewien, czy Select jest zoptymalizowany pod kątem wydajności, ale to jest jak krótszy i jasnej alternatywy dla kod dostarczony przez PO.

Szybki test porównawczy dał następujące wyniki: Edytuj: dodanie zaakceptowanej odpowiedzi alternatywnej.

  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

to nie jest tylko skrót do jego drugiej pętli? Czy wybór jest w znacznym stopniu zoptymalizowany w porównaniu? (nie facetem z rubinem) –

+0

Tak, właśnie uświadomiłem sobie, że istnieją marginalne wyniki. Hmm. Dam mu kredyt, ponieważ on odpowiedział przed tobą. Podoba mi się, że wybrałeś, ale nie myślałem o tym. – jason328

+2

Przeprowadziłem test porównawczy i jeśli porównasz duże tablice łańcuchów z odwróconą kolejnością (więc trudniej jest dopasować do CPU), wtedy uzyskasz kolejność różnicy prędkości.'&' było 30 razy szybsze niż 'select' z' include'. –

Powiązane problemy