2014-10-11 5 views
6

Ich möchte doppelte Objekte innerhalb eines Array Objekts entfernen. Am besten erklären Sie es mit einem Beispiel.Wie kann ich doppelte Elemente in allen Elementen eines Ruby-Arrays eleganter entfernen?

Ich habe folgendes Array

entries = ["a b c", "a b", "c", "c d"] 

ich eine Methode wollen, die diese nach oben durch das Entfernen doppelter Elemente aus Elementen in der Array reinigen wird und das Rück ein Array, die ein Element für jedes einzelne Element hat.

hier ist also die Methode, die ich geschrieben habe, dies zu tun:

class Array 
    def clean_up() 
    self.join(" ").split(" ").uniq 
    end 
end 

Also wenn ich jetzt entries.clean_up nenne ich folgend als Ergebnis erhalten:

["a", "b", "c", "d"] 

Das ist genau das Ergebnis, das ich Wollen, aber gibt es einen eleganteren Weg, dies in Ruby zu tun?

+0

Ich würde über jedes Element Schleife, die sie spaltet, um ein großes Array von Begriffen zu bilden, dann uniq es. – Sukima

+0

Möchten Sie Eleganz oder Leistung? Du kannst nicht immer beides haben. –

+0

Beide wären nett :), aber ich habe die Formulierung am Ende angepasst, um auf eine elegantere Lösung zu konzentrieren, wenn eine existiert. –

Antwort

1

split teilt standardmäßig Whitespace auf (vorausgesetzt natürlich, dass Sie nichts Wahnsinniges getan haben, wie das Ändern von $;). Sie möchten jeden String aufteilen und die Ergebnisse in eine Liste reduzieren, wenn Sie "X für jedes Element ausführen und reduzieren" möchten, wenn Sie flat_map verwenden möchten. Putting diejenigen zusammen ergibt:

self.flat_map(&:split).uniq 

Wenn Sie nur auf Räume teilen wollen oder nicht wollen, auf geistige Gesundheit hängen, dann könnten Sie:

self.flat_map { |s| s.split(' ') }.uniq 

oder ähnliches.

+0

Danke, das funktioniert, dass es mir das Ergebnis gibt, das ich will. Kannst du erklären, ob es besser ist als meine bereitgestellte Lösung, abgesehen von der Verwendung von 'flat_map', die für diese Art von Operation gedacht ist? –

+0

Ich mag diesen Ansatz, weil er der Absicht besser entspricht, Join/Split erhält das Ergebnis durch Tricks und nicht durch einen direkten Ausdruck der Absicht. Hier gibt es natürlich viele Meinungen. –

Verwandte Themen