Arraysortierungen mit Visual Basic .NET
Veröffentlicht: 06. Dez 2002 | Aktualisiert: 09. Nov 2004
Von Mathias Schiffer
Dieser Artikel zeigt Ihnen, wie Sie mit Visual Basic .NET Elemente in Arrays sortieren. Des Weiteren erhalten Sie Informationen, über die Möglichkeit Ihre eigenen Objekte sortierbar zumachen und Sortierregeln zu definieren.
Auf dieser Seite
Eigene Datentypen sortierbar gestalten
Eigene Sortierregeln definieren
Wie Sie Arrays mit Visual Basic 6 sortieren können, haben Sie im MSDN Quickie "Arrays sortieren mit BubbleSort und QuickSort" erfahren. Das .NET Framework macht Ihnen die Sache unter Visual Basic .NET noch einfacher. Hier sortieren Sie ein Array arrArray einfach durch folgende Anweisung:
Array.Sort(arrArray)
Auch Teile eines Arrays können Sie mithilfe von Array.Sort sortieren. Hierfür geben Sie das erste Element und die Anzahl der darauf folgenden Elemente des zu sortierenden Teilarrays als zusätzliche Integer-Parameter an:
Array.Sort(arrArray, 5, 20)
Möchten Sie ein Array rückwärts sortieren, so führen Sie zuerst eine Vorwärtssortierung durch und kehren die Reihenfolge der Array-Inhalte dann mittels Array.Reverse um:
Array.Sort(arrArray) Array.Reverse(arrArray)
Für die Rückwärtssortierung eines Teilarrays können Sie analog vorgehen:
Array.Sort(arrArray, 5, 20) Array.Reverse(arrArray, 5, 20)
Voraussetzung für dieses Vorgehen ist, dass die Datentypen, die sich als Werte im Array befinden, die Schnittstelle System.IComparable implementieren. Dies ist bei den vordefinierten Typen des .NET Frameworks der Fall.
Eigene Datentypen sortierbar gestalten
Ihre eigenen Typen müssen die Schnittstelle System.IComparable ebenfalls implementieren, wenn sie auf diese einfache Weise sortierbar sein sollen.
Die IComparable-Funktion CompareTo wird bei Sortierungen jeweils aufgerufen, wenn ein anderes Element mit dem aktuellen Element verglichen werden soll. Liefert sie einen negativen Wert zurück, gilt das andere Objekt als größer als das aktuelle Objekt. 0 ist der vorgesehene Rückgabewert für Elementgleichheit und ein positiver Wert signalisiert, dass das andere Objekt kleiner ist als das aktuelle Objekt.
Im folgenden Beispielcode finden Sie eine Implementation in einer einfach gehaltenen Klasse:
Class MeinTyp : Implements System.IComparable Private m_Wert As Long Private m_Gewichtung As Double ' Konstruktor Public Sub New(ByVal Wert As Integer, _ ByVal Gewichtung As Integer) m_Wert = Wert m_Gewichtung = Gewichtung End Sub ' Beispieleigenschaft Wert Public Property Wert() As Integer Get Return m_Wert End Get Set(ByVal Value As Integer) m_Wert = Value End Set End Property ' Beispieleigenschaft Gewichtung Public Property Gewichtung() As Double Get Return m_Gewichtung End Get Set(ByVal Value As Double) m_Gewichtung = Value End Set End Property ' Implementation CompareTo: Sortierung nach Eigenschaft Wert Public Function CompareTo(ByVal o As Object) As Integer _ Implements System.IComparable.CompareTo ' Typüberprüfung des Parameters If Not (TypeOf o Is MeinTyp) Then Throw New ArgumentException("o muss vom Typ 'MeinTyp'" & _ "sein, ist aber vom Typ '" & _ TypeName(o).ToString & "'.") End If ' Entscheidung über Größer-/Kleiner-/Gleich-Status Dim Vergleichsobjekt As MeinTyp = CType(o, MeinTyp) If Vergleichsobjekt.Wert = m_Wert Then Return 0 ElseIf Vergleichsobjekt.Wert < m_Wert Then Return 1 Else Return -1 End If End Function ' ToString Public Overrides Function ToString() As String Return m_Wert.ToString End Function End Class
Eigene Sortierregeln definieren
Die Methode Array.Sort sortiert ein Array nach den vorgegebenen Regeln der CompareTo-Funktion. Sie können die Elemente eines Arrays mithilfe dieser Methode aber auch nach eigenen Regeln sortieren lassen.
Ein Beispiel: Im Fall der obigen Klasse MeinTyp wird Array.Sort ein Array dieses Typs standardmäßig nach der Eigenschaft Wert sortieren. Sie können jedoch auch nach der Eigenschaft Gewichtung sortieren, ohne auf die Dienste von Array.Sort verzichten zu müssen.
Hierfür benötigen Sie eine Klasse, die Ihre eigenen Sortierregeln definiert (einen "Comparer"). Sie implementiert die Funktion Compare der Schnittstelle System.Collections.IComparer, deren Rückgabewert den Regeln für die oben erläuterte Funktion CompareTo entspricht. Die beiden zu vergleichenden Objekte werden dabei als Parameter übergeben (wobei das erste Objekt dem aktuellen Objekt in der Funktion CompareTo entspricht).
Für den Beispielfall, ein Array mit Elementen des Typs MeinTyp nach der Eigenschaft Gewichtung statt der Eigenschaft Wert zu sortieren, kann ein Comparer so implementiert werden:
Class MeinTypGewichtungsSortierung : _ Implements System.Collections.IComparer ' Implementation von IComparer.Compare: Public Function Compare(ByVal x As Object, _ ByVal y As Object) As Integer _ Implements System.Collections.IComparer.Compare ' Typüberprüfung: If Not (TypeOf x Is MeinTyp And TypeOf y Is MeinTyp) Then Throw New ArgumentException("Die zu vergleichenden " & _ "Objekte müssen vom Typ" & _ "'MeinTyp' sein.") End If ' Entscheidung über Größer-/Kleiner-/Gleich-Status Dim Gewichtung1 As Double = CType(x, MeinTyp).Gewichtung Dim Gewichtung2 As Double = CType(y, MeinTyp).Gewichtung Return Gewichtung1.CompareTo(Gewichtung2) End Function End Class
Um Ihren eigenen Comparer bei der Sortierung mittels Array.Sort zum Einsatz zu bringen, übergeben Sie der Methode eine Instanz Ihrer Comparer-Klasse als letzten Parameter:
Array.Sort(arrMeinTyp, New MeinTypGewichtungsSortierung())
Für Teilarrays erfolgt der Aufruf analog:
Array.Sort(arrMeinTyp, 5, 20, New MeinTypGewichtungsSortierung())