Wie erstelle ich die Schnittmenge zweier Hashes?

8

Ich habe zwei Hashes:

%Vor%

Ich brauche einen Hash, der gemeinsame Schlüssel in beiden Hashes enthält:

%Vor%

Ist es möglich, es ohne irgendeine Schleife zu machen?

    
user2575339 12.07.2013, 06:50
quelle

3 Antworten

12
%Vor%

Dies wird nicht den gleichen Effekt wie der Code in der Frage haben, stattdessen wird es zurückgeben:

%Vor%

Die Reihenfolge der Hashes ist hier wichtig. Die Werte werden immer dem Hash entnommen, an den #keep_if gesendet wird.

%Vor%     
Koraktor 12.07.2013 06:55
quelle
9

Ich würde damit gehen:

%Vor%

Was man etwas reduzieren kann:

%Vor%

Der Trick liegt in der Methode & . Die Dokumentation sagt:

  

Überschneidung setzen - Gibt ein neues Array zurück, das die für die beiden Arrays gemeinsamen Elemente enthält, ausgenommen Duplikate. Die Reihenfolge wird vom ursprünglichen Array beibehalten.

Hier sind einige Benchmarks, um zu zeigen, was der effizienteste Weg ist:

%Vor%

Ruby 1.9.3-p448:

%Vor%

Wird unter Ruby 2.0.0-p247 ausgeführt:

%Vor%

Koraktors ursprünglicher Code funktioniert nicht, aber er hat es mit seinem zweiten Code-Pass gut gemacht und geht mit der besten Geschwindigkeit davon. Ich habe die Methode santhosh_2 hinzugefügt, um zu sehen, welchen Effekt das Entfernen von key? hätte. Es hat die Routine ein wenig beschleunigt, aber nicht genug, um Koraktors zu überholen.

Nur zu Dokumentationszwecken habe ich Koraktors zweiten Code optimiert, um auch die key? -Methode zu entfernen, und mehr Zeit damit verbracht. Hier ist die hinzugefügte Methode und die neue Ausgabe:

%Vor%     
the Tin Man 12.07.2013 07:00
quelle
8
%Vor%     
Santhosh 12.07.2013 07:12
quelle

Tags und Links