Beim Sortieren der Daten in einem eindimensionalen Double-Array durch die Methode 'Array.Copy' tritt bei Verwendung des Standard-Comparers bekanntlich das Problem auf, dass Double.Nan-Werte nicht an den Anfang oder das Ende des Array gerückt werden, sondern nach dem Sortieren 'irgendwo' zwischen den Daten stehen. (Das liegt vermutlich daran, dass die Prüfung, ob ein Double-Wert 'Nan' enthält, sehr rechenzeitaufwendig.) Allerdings: Der Sortiervorgang kann bei Verwendung des Standard-Comparers durcheinandergeraten. Hier ein Comparer, der beim Sortieren ggf. die NaN-Werte an das Ende des Arays rückt. (Beim Vergleich eines gültigen Doublewertes mit einem NaN-Wert wird der Nan-Wert vom 'DoubleComparer' stets als der relativ größere Wert angegeben.) Der Rechenzeitbedarf für das Sortieren großer Arrays liegt bei Anwendung des 'DoubleComparers' etwa 3x höher - im Vergleich zum Bedarf bei Verwendung des StandardComparers - und zwar unabhängig davon, ob und wie viele NaN.Werte im Array vorliegen. Grundsätzlich ist bei der Programmierung eines 'Comparers' für Sortierfunktionen zu beachten, dass bei sukzessiver Anwendung keine widersprüchlichen Vergleichs-Ergebnisse auftreten dürfen (also etwa: a > b, b > c, c > a). Als (langsame und etwas umständliche) Alternative bietet sich die OrderBy-Methode der Enumerable-Klasse an (Namespace: System.Linq.Enumerable). Dieses Verfahren sortiert NaN-Werte an den Anfang des Array, falls man als Parameter die sogenannte 'Identitätsfunktion' verwendet. Auch hier ist es möglich, eine selbsterstellte Comparer-Klasse für den Vergleich beim Sortieren anzugeben./p> Aufrufbeispiele: Randomize(1000.0#) ' Array erstellen Dim n As Integer = 25 Dim arr(n) As Double ' Array mit Zufallswerten füllen Fill(arr) ' einige Sonderwerte zuweisen arr(5) = Double.PositiveInfinity arr(8) = Double.MaxValue arr(10) = Double.NaN arr(20) = Double.NegativeInfinity arr(22) = Double.NaN arr(25) = Double.MinValue Array.Sort(arr, New DoubleComparer) arr = arr.AsEnumerable.OrderBy _ (Of Double)(Function(arg) arg).ToArray() arr = arr.AsEnumerable.OrderBy _ (Of Double)(Function(arg) arg, New DoubleComparer).ToArray() Und hier die Comparer-Klasse: Public Class DoubleComparer Implements IComparer(Of Double) Public Function Compare(ByVal x As Double, _ ByVal y As Double) As Integer _ Implements IComparer(Of Double).Compare ' NaN-Wert? Dim is_x_undef As Boolean = Double.IsNaN(x) Dim is_y_undef As Boolean = Double.IsNaN(y) ' Vergleich durchführen If is_x_undef And is_y_undef Then Return 0 ElseIf is_x_undef Then Return 1 ElseIf is_y_undef Then Return -1 ElseIf x = y Then Return 0 ElseIf x > y Then Return 1 Else Return -1 End If End Function End Class Zwei Hilfsfunktionen: Public Sub Fill(Of T)(ByRef D1arr As T()) For i As Integer = 0 To D1arr.GetUpperBound(0) D1arr(i) = CType(Convert.ChangeType(RandomNumber, GetType(T)), T) Next i End Sub Public Function RandomNumber() As Double Dim r As Double = Microsoft.VisualBasic.Rnd If Microsoft.VisualBasic.Rnd < 0.5 Then r *= -1 Return r End Function Dieser Tipp wurde bereits 8.907 mal aufgerufen. Voriger Tipp | Zufälliger Tipp | Nächster Tipp
Anzeige
Diesen und auch alle anderen Tipps & Tricks finden Sie auch auf unserer aktuellen vb@rchiv Vol.6 Ein absolutes Muss - Geballtes Wissen aus mehr als 8 Jahren vb@rchiv! - nahezu alle Tipps & Tricks und Workshops mit Beispielprojekten - Symbol-Galerie mit mehr als 3.200 Icons im modernen Look Weitere Infos - 4 Entwickler-Vollversionen (u.a. sevFTP für .NET), Online-Update-Funktion u.v.m. |
Neu! sevEingabe 3.0 Einfach stark! Ein einziges Eingabe-Control für alle benötigten Eingabetypen und -formate, inkl. Kalender-, Taschenrechner und Floskelfunktion, mehrspaltige ComboBox mit DB-Anbindung, ImageComboBox u.v.m. Tipp des Monats März 2024 Dieter Otter UTF-8 Konvertierung von Dateien und Strings VB6 selbst verfügt über keine Funktionen zur UTF-8 Konvertierung von Daten. Mit Hilfe des ADODB.Stream-Objekts lassen sich diese fehlenden Funktionen aber schnell nachrüsten. TOP Entwickler-Paket TOP-Preis!! Mit der Developer CD erhalten Sie insgesamt 24 Entwickler- komponenten und Windows-DLLs. Die Einzelkomponenten haben einen Gesamtwert von 1605.50 EUR... |
||||||||||||||||
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein. |