Benutzer-Werkzeuge

Webseiten-Werkzeuge


k7:k7.4:k7.4.9:k7.4.9.1:start

7.4.9.1 Sortierung eindimensionaler Arrays

7.4.9.1.1 Beispiel 1 – Sortierung eines eindimensionalen nativen Arrays

Das Sortieren der Elemente von eindimensionalen nativen Arrays funktioniert mit der Sort(..)-Methode problemlos – wie das folgende Beispiel zeigt:

Public Sub btnNativesArraySortieren_Click() 
  Dim iCount, k As Integer 
  Dim a1DArray As New String[] 
  Dim aNames As String[] = ["Adler", "Bär", "Dachs", "Fuchs", "Meise", "Uhu", "Elch"]

  iCount = 5 
  a1DArray.Resize(iCount) 

  Randomize

  For k = 0 To a1DArray.Bounds[0] - 1 
    a1DArray[k] = aNames[Int(Rnd(0, aNames.Count))] 
  Next ' k 

  ShowElements(a1DArray) 
    a1DArray.Sort(gb.Ascent) ' Sortier-Standard a..z
  ShowElements(a1DArray) 
    a1DArray.Reverse() 
  ShowElements(a1DArray) 
 
End ' btnNativesArraySortieren_Click() 

Public Sub ShowElements(aArray As String[]) 
  Dim sElement As String 
  
  For Each sElement In aArray 
    Print sElement, 
  Next ' sElement 
  Print 
  
End ' ShowElements(aArray As String[]) 

Anzeige der Elemente des Arrays a2DArray in der Konsole der Gambas-IDE:

Bär     Uhu     Adler   Meise   Fuchs   → Original 
Adler   Bär     Fuchs   Meise   Uhu     → Aufsteigend sortiert 
Uhu     Meise   Fuchs   Bär     Adler   → Sortierte Elemente invertiert sortiert 

Hinweis:

Das Umsortieren der Elemente in einem Array mit der Methode Array.Reverse() kann als Spezialfall des Sortierens eines Arrays aufgefasst werden. Dabei werden alle Elemente von [E0 bis Ek] im Array auf [Ek bis E0] umsortiert.

7.4.9.1.2 Beispiel 2 – Sortierung eines eindimensionalen abgeleiteten Arrays

Es sollen die Namen aller Steuerelemente vom Typ 'Label' auf dem Formular erkundet und sortiert ausgegeben werden. Die folgende Idee zur Umsetzung klingt plausibel:

  • Zuerst werden alle Steuerelemente vom Typ Label erfasst und die gefundenen Label als Objekt in einem abgeleiteten Array aLabels vom Typ Label[ ] gespeichert.
  • Dann wird das Array aLabels (aufsteigend) sortiert.
  • Anschließend werden die Label-Namen der sortierten Label im Array aLabels ausgelesen und angezeigt.

Folgender Quelltext wird eingesetzt:

Public Sub btnSortLabel1_Click()
  Dim k As Integer
  Dim lLabel As Label  
  Dim aLabels As New Label[] 
  Dim hControl As Control
 
  For Each hControl In Me.Children    
    If Object.Type(hControl) = "Label" Then 
       Inc k
       aLabels.Resize(k)  
       aLabels[k - 1] = hControl
    Endif
  Next ' hControl 
 
  For Each lLabel In aLabels ' Zur Kontrolle
    Print lLabel.Name
  Next
  aLabels.Sort(gb.Ascent)
  For Each lLabel In aLabels
    Print lLabel.Name
  Next
 
End ' btnSortLabel1_Click()

Zur Kontrolle werden zuerst die Namen der Label aus dem originalen, unsortierten Array ausgegeben. Es zeigte sich dieses Ergebnis in der Konsole der IDE:

lblMultiArray
lblClassArray
lblLabels
lblDemonstration

Die Reihenfolge der Elemente im Array aLabels entspricht der Reihenfolge der einzelnen Label in der Hierarchie der sichtbaren Steuerelemente in der Gambas-IDE. Mit dem Ergebnis bei der Ausgabe der Namen der Label aus dem sortierten Array aLabels kann man nicht zufrieden sein:

lblClassArray
lblLabels
lblMultiArray
lblDemonstration

Sortiert sieht anders aus! Der Grund ist darin zu sehen, dass die Elemente in einem Array vom Typ Label[ ] – als einem abgeleitetem Array – nach ihren Adressen im Speicher verglichen werden, da die Klasse Label keine _compare()-Methode implementiert.

Die ursprüngliche Idee wird aus diesem Grund modifiziert:

  • Zuerst werden alle Steuerelemente vom Typ Label erfasst und von allen gefundenen Labeln sofort die Label-Namen in einem Array aLabelNames vom Typ String[ ] gespeichert.
  • Dann wird das native Array aLabelNames (aufsteigend) sortiert.
  • Abschließend werden die Label-Namen aus dem sortierten Array aLabelNames ausgelesen und angezeigt.

Der modifizierte Quelltext ist hier nachzulesen:

Public Sub btnSortLabel2_Click()
  Dim k As Integer 
  Dim sName As String
  Dim aLabelNames As New String[] ' Natives Array
  Dim hControl As Control
 
  For Each hControl In Me.Children    
    If Object.Type(hControl) = "Label" Then 
       aLabelNames.Add(hControl.Name)
    Endif
  Next ' hControl   
  For Each sName In aLabelNames ' Zur Kontrolle
    Print sName
  Next
  Print
  aLabelNames.Sort(gb.Ascent)  
  For Each sName In aLabelNames
    Print sName
  Next  
End ' btnSortLabel2_Click()

In der Konsole wird nun die korrekte Liste der aufsteigend sortierten Label-Namen angezeigt:

lblClassArray
lblDemonstration
lblLabels
lblMultiArray

Download

Wir verwenden Cookies, um unser Internetangebot optimal zu gestalten. Durch weitere Nutzung dieser Webseite stimmen Sie der Verwendung von Cookies zu. Informationen zu Cookies erhalten Sie in unserer Datenschutzerklärung
k7/k7.4/k7.4.9/k7.4.9.1/start.txt · Zuletzt geändert: 20.06.2016 (Externe Bearbeitung)

Seiten-Werkzeuge