380 Stimmen

Entfernen Sie doppelte Elemente aus dem Array in Ruby

Ich habe ein Ruby-Array, das doppelte Elemente enthält.

array = [1,2,2,1,4,4,5,6,7,8,5,6]

Wie kann ich alle doppelten Elemente aus diesem Array entfernen, während ich alle einzigartigen Elemente beibehalte, ohne for-Schleifen und Iteration zu verwenden?

809voto

Mithun Sasidharan Punkte 20254
array = array.uniq

uniq entfernt alle doppelten Elemente und behält alle eindeutigen Elemente im Array bei.

Dies ist eine von vielen Schönheiten der Ruby-Sprache.

55 Stimmen

Nein, die uniq! Methode gibt nil zurück, wenn das Array bereits eindeutig war Ex: a = [1,2,3,4] a.uniq -> [1,2,3,4] aber a.uniq! -> nil

15 Stimmen

Ich würde das nicht wirklich als Schönheit der Ruby-Sprache sehen... es ist einfach die Schönheit der Ruby-Standardbibliothek? Versteh mich nicht falsch, es gibt viele schöne Dinge über die Sprache.

8 Stimmen

Bitte übersetzen Sie dies unter Beibehaltung der gleichen HTML-Tags, falls vorhanden, von en nach de: Schreiben Sie das gleiche auf Objective-C, Javascript und PHP. Sagen Sie uns dann, dass Ruby keine schöne Sprache ist!

90voto

jaredsmith Punkte 7046

Sie können den Schnitt zurückgeben.

a = [1,1,2,3]
a & a

Dies löscht auch Duplikate.

16 Stimmen

Funktional ist diese Antwort korrekt, aber ich denke, dass dies deutlich weniger lesbar ist als einfach uniq zu verwenden.

23 Stimmen

Ich habe es nur hier hingestellt, damit jeder Besucher dieser Seite auch andere Möglichkeiten sieht, es zu tun. Ich wollte nicht sagen, dass es auf irgendeine Weise besser ist.

5 Stimmen

Der Grund, warum dies funktioniert, liegt darin, dass bei der Verwendung von Mengenoperationen das resultierende Array als Menge behandelt wird, die in der Regel keine wiederholten Werte aufweist. Die Verwendung von a | a (Vereinigung) würde den gleichen Trick tun.

59voto

Marek Příhoda Punkte 10858

Sie können die doppelten Elemente mit der `uniq` Methode entfernen:

array.uniq  # => [1, 2, 4, 5, 6, 7, 8]

Es könnte auch nützlich sein zu wissen, dass `uniq` einen Block annimmt. Wenn Sie also ein Array von Schlüsseln haben:

["bucket1:file1", "bucket2:file1", "bucket3:file2", "bucket4:file2"]

Und Sie möchten wissen, welche eindeutigen Dateien es gibt, können Sie es herausfinden mit:

a.uniq { |f| f[/\d+$/] }.map { |p| p.split(':').last }

5 Stimmen

Ich bin ein wenig verwirrt darüber. Der Block wird verwendet, wenn Sie Ihre eigene Vergleichsfunktion benötigen -- in Ihrem Beispiel würde das Senden von uniq an dieses Array ohne Block denselben Wert zurückgeben wie mit Ihrem Block.

22voto

Lri Punkte 25192

Wenn jemand nach einer Möglichkeit sucht, alle Vorkommen wiederholter Werte zu entfernen, siehe "Wie kann ich effizient wiederholte Elemente in einem Ruby-Array extrahieren?".

a = [1, 2, 2, 3]
counts = Hash.new(0)
a.each { |v| counts[v] += 1 }
p counts.select { |v, count| count == 1 }.keys # [1, 3]

4 Stimmen

Oder könnten einfach tun a = [1, 2, 2, 3] a.find_all { |x| a.count(x) == 1 } # [1, 3]

0 Stimmen

Die verlinkte Frage ist nicht die gleiche; Es fragt, wie man duplizierte Werte finden und zurückgeben kann. Der OP möchte Duplikate entfernen.

20voto

Finks Punkte 1631

Nur eine weitere Alternative, falls es jemanden interessiert.

Sie können auch die to_set-Methode eines Arrays verwenden, die das Array in ein Set umwandelt und per Definition sind Set-Elemente einzigartig.

[1,2,3,4,5,5,5,6].to_set => [1,2,3,4,5,6]

5 Stimmen

Wenn Sie sich um den Speicher kümmern, to_set wird 4 Objekte zuweisen, während uniq nur eins zuweist.

0 Stimmen

Ja, ich habe .uniq gegen .to_set in einem Benchmark-Test festgelegt und 32 ms für .to_set und 7 ms für .uniq erhalten. Zusammenfassend ist es in programmatischer Hinsicht viel weniger kostenintensiv, .uniq zu verwenden.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X