2014-10-11 11 views
6

Desidero rimuovere gli elementi duplicati all'interno di un oggetto Array. È meglio spiegare con un esempio.Come posso rimuovere più elegantemente elementi duplicati su tutti gli elementi di una matrice di rubini?

Ho il seguente Array

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

Voglio un metodo che pulirà questo da rimuovere gli elementi duplicati da all'interno di elementi in Array e restituire un Array che ha un elemento per ogni pezzo unico.

Quindi, ecco il metodo che ho scritto per fare questo:

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

Così ora quando chiamo entries.clean_up ricevo il seguente come risultato:

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

Questo è esattamente il risultato che vuoi ma c'è un modo più elegante per farlo in Ruby?

+0

Vorrei scorrere su ogni elemento dividendoli per creare una vasta gamma di termini e quindi unificarlo. – Sukima

+0

Vuoi eleganza o prestazioni? Non puoi sempre avere entrambi. –

+0

Entrambe sarebbero belle :) ma alla fine ho aggiustato il testo per concentrarmi su una soluzione più elegante se ne esiste una. –

risposta

1

split divide in spazi vuoti per impostazione predefinita (presupponendo ovviamente che non si sia fatto qualcosa di pazzo come cambiare $;). Vuoi dividere ogni stringa e appiattire i risultati in una lista, ogni volta che vuoi "fare X su ogni elemento e appiattire" che vuoi usare flat_map. Mettere insieme quelli rendimenti:

self.flat_map(&:split).uniq 

Se solo si desidera dividere gli spazi o non vogliono dipendere da sanità mentale, allora si potrebbe:

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

o simili.

+0

Grazie, funziona in quanto mi dà il risultato che voglio. Puoi spiegare se è migliore della mia soluzione fornita in alcun modo oltre all'uso di 'flat_map' che è inteso per questo tipo di operazione? –

+0

Mi piace questo approccio perché è una corrispondenza più stretta con l'intento, join/split ottiene il risultato attraverso l'inganno piuttosto che una semplice espressione di intenti. C'è un sacco di opinioni qui, ovviamente. –

Problemi correlati