Die Programmiersprache Ruby (German Edition)
enumerierbare Collection in ein Array um und sortiert die Elemente dieses Array. Standardmäßig wird die Sortierung anhand der Methode
<=>
der Elemente vorgenommen. Wenn allerdings ein Block bereitgestellt wird, werden diesem Elementpaare übergeben und er sollte
−1
,
0
oder
+1
zurückgeben, um ihre relative Reihenfolge anzugeben:
w = Set['apple','Beet','carrot'] # Ein Set von zu sortierenden Wörtern
w.sort # ['Beet','apple','carrot']: alphabetisch
w.sort {|a,b| b<=>a } # ['carrot','apple','Beet']: umgekehrt
w.sort {|a,b| a.casecmp(b) } # ['apple','Beet','carrot']: Groß-/Kleinschreibung
# ignorieren
w.sort {|a,b| b.size<=>a.size} # ['carrot','apple','Beet']: umgekehrte Länge
Wenn der Block, den Sie bei
sort
mit angeben, umfangreichere Berechnungen durchführen muss, um die Vergleiche vornehmen zu können, ist es effizienter, stattdessen
sort_by
zu verwenden. Der bei
sort_by
angegebene Block wird für jedes Element in der Collection einmal aufgerufen und sollte einen numerischen »Sortierschlüssel« für dieses Element liefern. Die Collection wird dann in aufsteigender Reihenfolge des Sortierschlüssels geordnet. Auf diese Weise wird ein Sortierschlüssel für jedes Element nur einmal berechnet und nicht bei jedem Vergleich zweimal:
# Sortierung, die Groß-/Kleinschreibung ignoriert
words = ['carrot', 'Beet', 'apple']
words.sort_by {|x| x.downcase} # => ['apple', 'Beet', 'carrot']
9.5.1.4 Collections durchsuchen
Enumerable
definiert diverse Methoden zum Suchen von einzelnen Elementen innerhalb einer Collection.
include?
und ihr Synonym
member?
suchen nach einem Element, das gleich (per
==
) ihrem Argument ist:
primes = Set[2, 3, 5, 7]
primes.include? 2 # => true
primes.member? 1 # => false
Die Methode
find
und ihr Synonym
detect
wenden den angegebenen Block auf jedes Element der Collection an. Wenn der Block etwas anderes als
false
oder
nil
zurückgibt, liefert
find
das Element zurück und beendet die Iteration. Wenn der Block immer
nil
oder
false
ergibt, liefert
find
den Wert
nil
:
# Findet das erste Subarray mit der Nummer 1
data = [[1,2], [0,1], [7,8]]
data.find {|x| x.include? 1} # => [1,2]
data.detect {|x| x.include? 3} # => nil: kein passendes Element
In Ruby 1.9 funktioniert die Methode
find_index
so ähnlich wie
find
, liefert aber den Index des passendes Elements zurück und nicht das Element selbst. Wie
find
gibt es
nil
zurück, wenn kein passender Eintrag da ist:
data.find_index {|x| x.include? 1} # => 0: das erste Element passt
data.find_index {|x| x.include? 3} # => nil: kein passendes Element
Beachten Sie, dass der Rückgabewert von
find_index
bei Collections wie Hashes und Sets nicht so hilfreich ist, da sie keine numerischen Indizes nutzen.
Enumerable
definiert andere Suchmethoden, die eine Collection passender Elemente und nicht nur ein einzelnes Element liefern. Wir behandeln diese Methoden im nächsten Abschnitt.
9.5.1.5 Subcollections auswählen
Die Methode
select
wählt die Elemente einer Collection aus, für die ein Block einen anderen Wert als
nil
oder
false
ergibt, und liefert sie zurück. Ein Synonym für diese Methode ist
find_all
– sie funktioniert wie
find
, gibt aber ein Array mit allen passenden Elementen zurück:
(1..8).select {|x| x%2==0} # => [2,4,6,8]: gerade Elemente auswählen
(1..8).find_all {|x| x%2==1} # => [1,3,5,7]: finde alle ungeraden Elemente
reject
ist das Gegenteil von
select
– die Elemente im zurückgegebenen Array sind die, für die der Block
false
oder
nil
liefert.
primes = [2,3,5,7]
primes.reject {|x| x%2==0} # => [3,5,7]: gerade Elemente verwerfen
Wenn Sie Elemente einer Collection sowohl auswählen als auch verwerfen wollen, verwenden Sie
partition
. Die Methode gibt ein Array mit zwei Arrays zurück. Das erste Subarray enthält Elemente, für die der Block true ist, das zweite Subarray die Elemente, für die der Block false ist:
(1..8).partition {|x| x%2==0} # => [[2, 4, 6, 8], [1, 3, 5, 7]]
Die Methode
group_by
von Ruby 1.9 ist eine Verallgemeinerung von
partition
. Statt den Block als Prädikat anzusehen und zwei Gruppen zurückzugeben, nimmt
group_by
den Rückgabewert des Blocks und verwendet ihn als Hash-Schlüssel. Dann wird dieser Schlüssel auf ein Array mit allen Collection-Elementen abgebildet, für die der Block diesen Wert zurückgegeben hat, zum Beispiel:
# Gruppiere Programmiersprachen anhand ihres ersten Buchstabens
langs = %w[ java perl python ruby ]
groups = langs.group_by {|lang| lang[0] }
groups # => {"j"=>["java"],
Weitere Kostenlose Bücher