2015-04-07 9 views
6

Ich versuche, eindeutige Elemente in einem Array zu finden und die nil Werte aus ihm zu entfernen. Meine Lösung sieht so aus:Array-Methode, die 'uniq' und 'kompakt' kombiniert

@array = [1, 2, 1, 1, 2, 3, 4, nil, 5, nil, 5] 
@array.uniq.compact # => [1, 2, 3, 4, 5] 

Gibt es eine einzelne Methode, die beide Operationen ausführt? Wenn nicht, was ist effizient, @array.uniq.compact oder @array.compact.uniq?

+1

Nein, gibt es nicht. Ich denke, '@ array.compact.uniq' sollte effizienter sein. –

+1

Nop. Aber erstellen Sie Ihre eigenen;) –

+1

Verwenden Sie die Bang-Gegenstücke ('@ array.uniq!'/'@ Array.compact!'), Um das Array in-Place zu ändern, sollte effizienter sein. – Stefan

Antwort

4

, aber Sie können sie anhängen in beliebiger Reihenfolge wie IE

array.uniq.compact 
array.compact.uniq 

Wie von PHTS, können Sie einen Block zu uniq passieren, aber ich sehe nicht, dass eine sehr hilfreiche Alternative zu sein über uniq.compact.

Für eine bessere Geschwindigkeit jedoch so etwas wie die folgenden helfen könnten:

[].tap do |new_array| 
    hash = {} 
    original_array.each do |element| 
    next if element.nil? || !hash[element].nil? 
    new_array << (hash[element] = element) 
    end 
end 

Schließlich, wenn die Geschwindigkeit ist nicht ein Problem, und Sie werden häufig diese Methode verwenden, dann könnten Sie Ihre eigene Methode zu erstellen:

class Array 
    def compact_uniq 
    self.compact.uniq 
    end 

    def compact_blank # in case you want to remove all 'blanks' as well 
    self.compact.reject(&:blank?) 
    end 
end 
1

Nein, es gibt keine solche Methode.

Ich denke @array.compact.uniq und @array.uniq.compact sind gleich, weil beide Methoden O (N) -Komplexität haben.

Als @Stefan erwähnt, mit Methoden mit ! erwähnt wird möglicherweise Speicherverbrauch verschrottet.


Als Alternative Art und Weise können Sie nur uniq Verfahren mit einem Block verwendet werden, die außer nil ein sicherlich vorhandenen Element zurückgibt, so wird es übersprungen werden. Zum Beispiel

@array.uniq { |s| s.nil? ? @array.first : s } 

Aber in diesem Fall müssen Sie sicherstellen, dass das erste Element des Arrays ist nicht nil. Kein

+0

Sie haben beide eine Komplexität von O (n) Zeit Ich bin gespannt: Was ist mit Speicherkomplexität? –

Verwandte Themen