Die Programmiersprache Ruby (German Edition)
entfernten nils
a.compact! # nils im Array entfernen: a ist jetzt [0,'b','B','b']
a.clear # a ist jetzt []
9.5.2 Arrays iterieren, durchsuchen und sortieren
Array
mixt das Modul
Enumerable
ein, so dass alle
Enumerable
-Iteratoren zur Verfügung stehen. Zusätzliche definiert die Klasse
Array
selbst ein paar wichtige Iteratoren sowie Such- und Sortiermethoden:
a = ['a','b','c']
a.each {|elt|print elt } # Der Basisiterator gibt "abc" aus
a.reverse_each {|e| print e} # Array-spezifisch: Ausgabe "cba"
a.cycle {|e| print e } # Ruby 1.9: Ausgabe "abcabcabc..." unendlich lang
a.each_index {|i| print i} # Array-spezifisch: Ausgabe "012"
a.each_with_index{|e,i| print e,i} # Enumerable: Ausgabe "a0b1c2"
a.map {|x| x.upcase} # Enumerable: gibt ['A','B','C'] zurück
a.map! {|x| x.upcase} # Array-spezifisch: ändert a direkt
a.collect! {|x| x.downcase!} # collect! ist Synonym für map!
# Suchmethoden
a = %w[h e l l o]
a.include?('e') # => true
a.include?('w') # => false
a.index('l') # => 2: Index des ersten Matches
a.index('L') # => nil: kein Match gefunden
a.rindex('l') # => 3: Suche rückwärts
a.index {|c| c =~ /[aeiou]/} # => 1: Index des ersten Vokals. Ruby 1.9.
a.rindex {|c| c =~ /[aeiou]/} # => 4: Index des letzten Vokals. Ruby 1.9.
# Sortieren
a.sort # => %w[e h l l o]: kopiere a und sortiere die Kopie
a.sort! # Array selbst sortieren: a ist jetzt ['e','h','l','l','o']
a = [1,2,3,4,5] # Ein neues Array, um nach gerade/ungerade zu sortieren
a.sort! {|a,b| a%2 <=> b%2} # Elemente modulo 2 vergleichen
# Arrays verwürfeln: das Gegenteil des Sortierens; nur Ruby 1.9
a = [1,2,3] # Sortiert beginnen
puts a.shuffle # Zufällig vermischen, z.B.: [3,1,2]. Es gibt auch shuffle!
9.5.2.5 Array-Vergleich
Zwei Arrays sind genau dann gleich, wenn sie dieselbe Anzahl an Elementen besitzen, die Elemente dieselben Werte haben und in derselben Reihenfolge auftreten. Die Methode
==
prüft die Gleichheit ihrer Elemente mit
==
, während die Methode
eql?
die Gleichheit der Elemente per Aufruf von
eql?
kontrolliert. In den meisten Fällen werden diese beiden Methoden zum gleichen Ergebnis führen.
Die Klasse
Array
ist nicht
Comparable
, implementiert aber den Operator
<=>
und definiert eine Ordnung für Arrays. Diese Ordnung entspricht der String-Ordnung, und Arrays mit Zeichencodes werden genauso sortiert, wie es mit entsprechenden
String
-Objekten geschehen würde. Arrays werden Element für Element von Index
0
aus verglichen. Wenn ein Paar von Elementen nicht gleich ist, liefert die Methode zum Vergleichen von Arrays genau den Wert zurück, den der Vergleich der Elemente geliefert hat. Wenn alle Elementpaare gleich sind und die beiden Arrays die gleiche Länge haben, sind die Arrays gleich und
<=>
gibt
0
zurück. Ansonsten liegt eines der Arrays vor dem anderen. In so einem Fall ist das längere Array größer als das kürzere. Beachten Sie, dass das leere Array
[]
vor jedem anderen Array liegt und auch immer kleiner als jedes nicht leere Array ist. Wenn zudem ein Paar von Array-Elementen nicht vergleichbar ist (wenn zum Beispiel eines eine Zahl und das andere ein String ist), liefert
<=>
den Wert
nil
statt des üblichen
−1
,
0
oder
+1
zurück:
[1,2] <=> [4,5] # => −1, da 1 < 4
[1,2] <=> [0,0,0] # => +1, da 1 > 0
[1,2] <=> [1,2,3] # => −1, da erstes Array kürzer ist
[1,2] <=> [1,2] # => 0: sie sind gleich
[1,2] <=> [] # => +1 [] immer kleiner als ein nicht leeres Array
9.5.2.6 Arrays als Stacks und Queues
Die Methoden
push
und
pop
fügen am Ende eines Array Elemente hinzu oder entfernen sie von dort. Sie ermöglichen Ihnen, ein Array als Last-on-first-off-Stack zu verwenden:
a = []
a.push(1) # => [1]: a ist jetzt [1]
a.push(2,3) # => [1,2,3]: a ist jetzt [1,2,3]
a.pop # => 3: a ist jetzt [1,2]
a.pop # => 2: a ist jetzt [1]
a.pop # => 1: a ist jetzt []
a.pop # => nil: a ist immer noch []
shift
ist wie
pop
, entfernt aber nicht das letzte, sondern das erste Element eines Array und liefert es zurück.
unshift
ist wie
push
, fügt das Element aber am Anfang des Array ein und nicht am Ende. Sie können
push
und
shift
verwenden, um eine First-in-first-out-Queue zu realisieren:
a = []
a.push(1) # => [1]: a ist [1]
a.push(2) # => [1,2]: a ist [1,2]
a.shift # => 1: a ist [2]
a.push(3) # => [2,3]: a ist [2,3]
a.shift # => 2: a ist [3]
a.shift # => 3: a ist []
a.shift # => nil: a ist []
9.5.2.7 Arrays als Mengen
Die Klasse
Array
implementiert die Operatoren
&
,
|
und
-
, um die Mengenoperationen Schnittmenge, Vereinigungsmenge und
Weitere Kostenlose Bücher