Hi,
da es mich immer wieder nervte, wenn ich mehrere Zahlen miteinander vergleichen musste, und mit der Funktion _Max() nur zwei gleichzeitig vergleichen konnte, habe ich diese kleine UDF geschrieben, um x-beliebig viele Zahlen miteinander zu vergleichen lassen (hab sie noch nicht allzu oft getestet).
Um die einzelnen Zahlen voneinander zu trennen fungieren alle Zeichen, außer Zahlen und dem "-"-Zeichen, sowie dem "."-Zeichen, da die Funktion sonst keine negativen Zahlen und keine Kommazahlen erkennt, es funtkionieren auch Leerzeichen, ebenso Buchstaben.
Mittels dem $Flag-"Parameter" kann entschieden werden, ob die Funktion die größte Zahl oder die kleinste Zahl zurückgeben soll.
$Flag = 0, bedeutet die Größte.
$Flag <> 0, bedeutet die Kleinste.
!!!ACHTUNG: Nicht mehr aktuell bitte im Spoiler für richtige Informationen nachschauen.
Spoiler anzeigen
;#_SortMinMax-FUNKTION-Start#======================================================================================
;Funktion:.................._SortMinMax
;Autor:.....................Ealendil (http://www.AutoIt.de)
;Beschreibung:..............gibt bei Erfolg ein Array zurück, welches von der höchsten
; zur kleinsten bzw. umgekehrt sortiert ist.
;Infos:.....................$Nr_1_to_Nr_n = Hier die Zahlen zum Vergleichen eingeben,
; diese müssen als String ("1,2,3,...") oder ('1,2,3,...')
; eingegeben werden.
; Es funktioniert ebenso mit einem Array,
; dieses muss allerdings 0-basiert sein.
;
; $SortMax = 1 bedeutet das die Funktion ein Array zurückgibt, welches
; folgendermaßen ausschaut:
; $Array[0] = Anzahl der zurückgegebenen Zahlen
; $Array[1] = höchste Zahl
; $Array[2] = zweithöchste Zahl
; $Array[3] = dritthöchste Zahl
;
; usw.
; $Array[n] = kleinste Zahl
; sollte $Sort_Max <> 1
; sein, so wird das Array umgekehrt sortiert zurückgegeben.
; $Split: hierbei kann angegeben werden, welche Zeichen zum trennen
; der Zahlen fungieren sollen, wird keines angegeben, so wird ","
; verwendet, man muss (falls ein String verwendet wird) jede Zahl mit den in
; $Split angegebenen Zeichen trennen.
;Return-Werte:..............ein Array, welches von der höchsten zur kleinsten bzw. umgekehrt
; sortiert ist.
; $Array[0] gibt die Anzahl der zurückgegeben Zahlen an.
; Als Trennzeichen fungieren alle Zeichen, welche bei $Split
; angegeben werden, sollten keine Angegeben, so wird "," verwendet.
;@Error-Werte:.............
; @Error = 0, kein Fehler
; 1, $Nr_1_to_Nr_n ist kein String ,falls ein String verwendet wird.
; 2, $Sort_Max ist entweder keine Zahl oder 0.
;#_SortMinMax-FUNKTION-End#========================================================================================
Func _SortMinMax($Nr_1_to_Nr_n, $Sort_Max = 1, $Split = '')
;Prüft ob $Sort_Max ein Integer ist, falls nicht, wird die Funktion verlassen.
If Not IsInt($Sort_Max) Then Return SetError(2, 0, 0)
Local $i, $Str = '', $i_i, $i_i_i, $i_Copy = 0
[/autoit] [autoit][/autoit] [autoit];Prüft ob Zeichen für $Split vorhanden sind, falls nicht, dann $Split = ','.
If $Split = '' Then $Split = ','
;Prüft ob $Nr_1_to_Nr_n ein Array ist. Falls dies zutrifft, wird ein String erstellt,
;welches jedes Zeichen, in $Split eingegebenen Zeichen, voneinander trennt.
If IsArray($Nr_1_to_Nr_n) Then
Local $Str_Trim = ''
For $i = 0 To UBound($Nr_1_to_Nr_n) - 1
$Str_Trim &= $Nr_1_to_Nr_n[$i] & $Split
Next
$Str = StringTrimRight($Str_Trim, 1)
Else
$Str = $Nr_1_to_Nr_n
;Prüft ob $Str ein String ist, falls nicht wird die Funktion verlassen.
If Not IsString($Str) Then Return SetError(1, 0, 0)
EndIf
;"Haupt"-String wird nun gesplitet.
Local $sp = StringSplit($Str, $Split, 0), $aMax[$sp[0] + 1], $Zahl_Min = -9223372036954775808
;Weißt $aMax[0] die Anzahl der Elemente zu und weißt jedem Element in $Sp die Nummer zu,
;die das jeweilige Element darstellt.
$aMax[0] = $sp[0]
For $i = 0 To $sp[0]
$sp[$i] = Number($sp[$i])
Next
;Weißt jedem Element in $aMax $Zahl_Min zu
For $i = 1 To $sp[0]
$aMax[$i] = $Zahl_Min
Next
;Sortiert nun alle Zahlen von der Höchsten zur Kleinsten und weißt ihnen die entsprechenden Elemente
;in $aMax zu.
For $i_i = 1 To $sp[0]
For $i = 1 To $sp[0]
If $sp[$i] > $aMax[$i_i] Then
$aMax[$i_i] = $sp[$i]
$i_i_i = $i
EndIf
Next
$sp[$i_i_i] = $Zahl_Min
Next
;Sollte der $Sort_Max Parameter <> 1 sein, also, soll das Array von der kleinsten zur höchsten Zahl
;sortiert sein, dann wird nun ein weiteres Array erstellt, welches jedes Element von $aMax enthält und
;alle Zahlen entsprechend miteinander vertauscht.
;Anschließend wird das neu sortierte Array zurückgegeben.
If Not $Sort_Max = 1 Then
Local $aMax_Copy[$sp[0] + 1]
For $i = 1 To $aMax[0]
$aMax_Copy[$i] = $aMax[$i]
Next
For $i = $aMax[0] To 1 Step -1
$i_Copy += 1
$aMax[$i] = $aMax_Copy[$i_Copy]
Next
Return $aMax
Else
Return $aMax
EndIf
EndFunc ;==>_SortMinMax
#include <Array.au3>
[/autoit] [autoit][/autoit] [autoit]$test = _SortMinMax('2,34,356256,7843,9787945.67,-4,-245246,346', 1, ',')
_ArrayDisplay($test)
$try = _SortMinMax('-2,-34453.67434,57342', 0, ',')
_ArrayDisplay($try)
Dim $array[7]
$array[0] = '1'
$array[1] = 2
$array[2]= 235425.5421
$array[3]= -35326.352462
$array[4]='3523'
$array[5]=556578457546.454
$array[6]='3456534.34653'
$tryit = _SortMinMax($array)
_ArrayDisplay($tryit)
Da ich die Funktion noch nicht ausführlich getestet habe, bitte um Feedback.
Hoffe sie hilft jemandem.
LG
Ealendil
#Edit1: Rechtschreibung korrigiert.
#Edit2: Es funktioniertem nur noch "," und Leerzeichen als Trennzeichen.
#Edit3: Man kann nun die Trennzeichen frei wählen, sowie wurde die Arbeitsweise verändert, Kommazahlen, werden nun auch unterstützt. Erklärungen dazu geschrieben. Name der Func() geändert. Statt dem String kann auch ein 0-basiertes Array verwendet werden.