String (Zeit) bearbeiten

    • Offizieller Beitrag

    Hi,

    kleiner Test, wer hat die beste Lösung um

    [autoit]

    Global $str[2] = ['4:32', '10:01']
    For $i = 0 To UBound($str) - 1

    [/autoit][autoit][/autoit][autoit]

    Next

    [/autoit]

    alle Zeiten immer 00:00 in diesem Format auszugeben.

    So long,

    Mega

    P.S.: Alle Autoit-Funktionen StringFormat oder RegExp sind erlaubt - hauptsache schnell!

  • [autoit]

    Global $str[2] = ['4:32', '10:01']
    For $i = 0 To UBound($str) - 1
    $time = StringSplit($str[$i], ":")
    If $time[1] <= 9 AND StringLen($time[1]) = 1 Then $time[1]="0"&$time[1]
    If $time[2] <= 9 AND StringLen($time[2]) = 1 Then $time[2]="0"&$time[2]
    $str[$i] = $time[1]&":"&$time[2]
    Next

    [/autoit][autoit][/autoit][autoit]

    MsgBox(0,"", $str[0]&" "&$str[1])

    [/autoit]

    so? zur Schnelligkeit kann ich nix sagen

    • Offizieller Beitrag

    Hi,

    na das ist doch schon mal ein Anfang. Ich probiere mich auch mal an einer schönen Lösung.

    Edit:

    Hier mein Versuch :

    [autoit]

    Global $str[3] = ['4:32', '10:01', '1:01']

    [/autoit][autoit][/autoit][autoit]

    For $i = 0 To UBound($str) - 1
    ConsoleWrite(_checkTime($str[$i]) & @CRLF)
    Next

    [/autoit][autoit][/autoit][autoit]

    Func _checkTime($time)
    Return StringRegExpReplace($time, '\b\d:\d\d', 0 & '\0')
    EndFunc ;==>_checkTime

    [/autoit]

    Edit: Kurz aber langsam :)

    So long,

    Mega

  • Nö tut es nicht - der Fall das die Zahl hinter dem ":" nur einstellig sein kann ist in der Aufgabenstellung aber auch nicht gegeben... ;)

    Nichts desto trotz ist auch diese Methode deutlich langsamer als über RegExp.
    Mit StringFormat() kommt man hier wahrscheinlich auch nicht sehr weit da man da das ganze erstmal splitten müsste - und das kostet Zeit.


    Edit: Könnte sein das man es doch mit StringFormat vernünftig schnell bekommen könnte - entspricht dann in etwa ziemlich der Geschwindigkeit der Methode mit RegExp() - hier mal ein Vergleichsskript:

    Spoiler anzeigen
    [autoit]

    $N = 10000

    [/autoit] [autoit][/autoit] [autoit]

    $Time = TimerInit()
    for $r = 1 To $N
    Dim $str[3] = ['4:32', '10:01', '1:01']

    For $i = 0 To UBound($str) - 1
    $str[$i] = StringRegExpReplace($str[$i], '\b\d:\d\d', 0 & '\0')
    Next

    [/autoit] [autoit][/autoit] [autoit]

    Next
    $EinsTime = TimerDiff($Time) / $N

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    $Time = TimerInit()
    for $r = 1 To $N
    Dim $str[3] = ['4:32', '10:01', '1:01']

    For $i = 0 To UBound($str) - 1
    $str[$i] = StringFormat("%02u", $Str[$i]) & StringRight($str[$i], 3)
    Next
    Next
    $ZweiTime = TimerDiff($Time) / $N

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    MsgBox(0,"", "RegExp: " & Round($EinsTime, 4) & ' ms' & @CRLF & "StringFormat: " & Round($ZweiTime, 4) & ' ms')

    [/autoit]

    2 Mal editiert, zuletzt von AspirinJunkie (11. Juli 2007 um 17:32)

  • Wo gibt es ein anderes Ergebnis?

    Alle 4 Methoden wandeln die vorgegebenen Ausgangswerte korrekt in die gewünschte Form um.
    Ich seh da jetzt irgendwie nicht ein Problem.
    Außer du willst auf einmal doch Strings umwandeln welche hinter dem ":" auch nur 1 Zahl stehen haben können.

    Und dabei ist es egal in welcher Reihenfolge ich die einzelnen Methoden teste - damit man verlässliche Ergebnisse bekommt lasse ich jede Methode ja auch 10.000x durchlaufen und bilde dann den Mittelwert.
    Kannst ja mal probieren die einzelnen Methoden im Skript in der Reihenfolge zu verändern - das Ergebniss der Zeitmessungen bleibt trotzdem gleich.

    Ansonsten wär das ein entsprechendes Speed-VergleichsSkript:

    Spoiler anzeigen
    [autoit]

    #include <Array.au3>

    [/autoit] [autoit][/autoit] [autoit]

    $N = 10000

    [/autoit] [autoit][/autoit] [autoit]

    $Zeit = TimerInit()
    for $r = 1 To $N
    Global $str[3] = ['4:32', '10:01', '1:01']

    [/autoit] [autoit][/autoit] [autoit]

    For $i = 0 To UBound($str) - 1
    If StringLen($str[$i]) < 5 Then $str[$i] = '0' & $str[$i]
    Next
    Next
    $VierTime = TimerDiff($Zeit) / $N

    [/autoit] [autoit][/autoit] [autoit]

    _ArrayDisplay($str, "StringLen")

    [/autoit] [autoit][/autoit] [autoit]

    $Zeit = TimerInit()
    for $r = 1 To $N
    Dim $str[3] = ['4:32', '10:01', '1:01']

    For $i = 0 To UBound($str) - 1
    $time = StringSplit($str[$i], ":")
    If $time[1] <= 9 AND StringLen($time[1]) = 1 Then $time[1]="0"&$time[1]
    If $time[2] <= 9 AND StringLen($time[2]) = 1 Then $time[2]="0"&$time[2]
    $str[$i] = $time[1]&":"&$time[2]
    Next
    Next
    $DreiTime = TimerDiff($Zeit) / $N

    [/autoit] [autoit][/autoit] [autoit]

    _ArrayDisplay($str, "Leviathan")

    [/autoit] [autoit][/autoit] [autoit]

    $Zeit = TimerInit()
    for $r = 1 To $N
    Dim $str[3] = ['4:32', '10:01', '1:01']

    For $i = 0 To UBound($str) - 1
    $str[$i] = StringRegExpReplace($str[$i], '\b\d:\d\d', 0 & '\0')
    Next

    Next
    $EinsTime = TimerDiff($Zeit) / $N

    [/autoit] [autoit][/autoit] [autoit]

    _ArrayDisplay($str, "RegExp")

    [/autoit] [autoit][/autoit] [autoit]

    $Zeit = TimerInit()
    for $r = 1 To $N
    Dim $str[3] = ['4:32', '10:01', '1:01']

    For $i = 0 To UBound($str) - 1
    $str[$i] = StringFormat("%02u", $Str[$i]) & StringRight($str[$i], 3)
    Next
    Next
    $ZweiTime = TimerDiff($Zeit) / $N

    [/autoit] [autoit][/autoit] [autoit]

    _ArrayDisplay($str, "StringFormat")

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    MsgBox(0,"", "RegExp: " & Round($EinsTime, 4) & ' ms' & @CRLF & "StringFormat: " & Round($ZweiTime, 4) & ' ms' & @CRLF & "Leviathan: " & Round($DreiTime, 4) & ' ms' & @CRLF & "StringLen: " & Round($VierTime, 4) & ' ms')

    [/autoit]
    • Offizieller Beitrag

    Anderer Gedanke - warum die Stringlänge prüfen?
    - Minuten bleiben immer 2-stellig
    - also ändert sich nur die Position von ':'

    [autoit]

    Global $str[3] = ['4:32', '10:01', '1:01']

    For $i = 0 To UBound($str) - 1
    If StringInStr($str[$i], ':') = 2 Then
    ConsoleWrite('0' & $str[$i] & @CRLF)
    Else
    ConsoleWrite($str[$i] & @CRLF)
    EndIf
    Next

    [/autoit]
  • Auch clever die Methode - bei meinen Tests war es die 2. Schnellste nach der Methode mit StringLen.

    Hier das damit aktualisierte Vergleichsskript:

    Spoiler anzeigen
    [autoit]

    #include <Array.au3>

    $N = 10000

    [/autoit] [autoit][/autoit] [autoit]

    $Zeit = TimerInit()
    for $r = 1 To $N
    Dim $str[3] = ['4:32', '10:01', '1:01']

    For $i = 0 To UBound($str) - 1
    If StringInStr($str[$i], ':') = 2 Then $str[$i] = '0' & $str[$i]
    Next
    Next
    $FuenfTime = TimerDiff($Zeit) / $N

    ;_ArrayDisplay($str, "BugFix")

    [/autoit] [autoit][/autoit] [autoit]

    $Zeit = TimerInit()
    for $r = 1 To $N
    Dim $str[3] = ['4:32', '10:01', '1:01']

    For $i = 0 To UBound($str) - 1
    If StringLen($str[$i]) < 5 Then $str[$i] = '0' & $str[$i]
    Next
    Next
    $VierTime = TimerDiff($Zeit) / $N

    ;_ArrayDisplay($str, "StringLen")

    $Zeit = TimerInit()
    for $r = 1 To $N
    Dim $str[3] = ['4:32', '10:01', '1:01']

    For $i = 0 To UBound($str) - 1
    $time = StringSplit($str[$i], ":")
    If $time[1] <= 9 AND StringLen($time[1]) = 1 Then $time[1]="0"&$time[1]
    If $time[2] <= 9 AND StringLen($time[2]) = 1 Then $time[2]="0"&$time[2]
    $str[$i] = $time[1]&":"&$time[2]
    Next
    Next
    $DreiTime = TimerDiff($Zeit) / $N

    ;_ArrayDisplay($str, "Leviathan")

    $Zeit = TimerInit()
    for $r = 1 To $N
    Dim $str[3] = ['4:32', '10:01', '1:01']

    For $i = 0 To UBound($str) - 1
    $str[$i] = StringRegExpReplace($str[$i], '\b\d:\d\d', 0 & '\0')
    Next

    Next
    $EinsTime = TimerDiff($Zeit) / $N

    ;_ArrayDisplay($str, "RegExp")

    $Zeit = TimerInit()
    for $r = 1 To $N
    Dim $str[3] = ['4:32', '10:01', '1:01']

    For $i = 0 To UBound($str) - 1
    $str[$i] = StringFormat("%02u", $Str[$i]) & StringRight($str[$i], 3)
    Next
    Next
    $ZweiTime = TimerDiff($Zeit) / $N

    ;_ArrayDisplay($str, "StringFormat")

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    $Zeit = TimerInit()
    for $r = 1 To $N
    Dim $str[3] = ['4:32', '10:01', '1:01']

    For $i = 0 To UBound($str) - 1
    If $str[$i] < 10 Then $str[$i] = '0' & $str[$i]
    Next
    Next
    $SechsTime = TimerDiff($Zeit) / $N

    ;_ArrayDisplay($str, "kleiner 10-Methode")

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    $Zeit = TimerInit()
    for $r = 1 To $N
    Dim $str[3] = ['4:32', '10:01', '1:01']

    For $i = 0 To UBound($str) - 1
    $str[$i] = StringRight('0' & $str[$i],5)
    Next
    Next
    $SiebenTime = TimerDiff($Zeit) / $N

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ;_ArrayDisplay($str, "Bernd")

    [/autoit] [autoit][/autoit] [autoit]

    MsgBox(0,"", "RegExp: " & Round($EinsTime, 4) & ' ms' & @CRLF & "StringFormat: " & Round($ZweiTime, 4) & ' ms' & @CRLF & "Leviathan: " & Round($DreiTime, 4) & ' ms' & @CRLF & "StringLen: " & Round($VierTime, 4) & ' ms' & @CRLF & "BugFix: " & Round($FuenfTime, 4) & ' ms' & @CRLF & "<10-Methode: " & Round($SechsTime, 4) & ' ms' & @CRLF & "Bernd: " & Round($SiebenTime, 4) & ' ms')

    [/autoit]


    Edit: Hab noch eine weitere Methode entdeckt welche bei mir die bisher schnellsten Werte liefert.
    Es beruht auf einem Vergleich ob die Werte vor dem ":" kleiner als 10 sind (da der Rest vom String bei einem Vergleich eines Strings mit einer Integer-Zahl sowieso abgeschnitten wird braucht man sich nicht erst um das splitten zu kümmern):

    [autoit]

    Dim $str[3] = ['4:32', '10:01', '1:01']

    For $i = 0 To UBound($str) - 1
    If $str[$i] < 10 Then $str[$i] = '0' & $str[$i]
    Next

    [/autoit]

    Hey das macht Spaß :tongue: - viel schneller sollte man das aber nicht mehr bekommen können denke ich.

    Edit2: Bernds Methode mit zum Vergleich gezogen (nun 2. schnellste Methode)

    2 Mal editiert, zuletzt von AspirinJunkie (11. Juli 2007 um 22:15)

    • Offizieller Beitrag

    Hallo,

    ich hab auch noch einen:

    [autoit]

    Dim $str[3] = ['4:32', '10:01', '1:01']

    [/autoit][autoit][/autoit][autoit]

    For $i = 0 To UBound($str) - 1
    $str[$i] = StringRight('0' & $str[$i],5)
    ConsoleWrite($str[$i] & @CRLF)
    Next

    [/autoit]
  • hab mir mal den Spass gemacht und die Ergebnisse verglichen :)

    [autoit]

    #include <Array.au3>

    $N = 1000

    [/autoit][autoit][/autoit][autoit]

    $Zeit = TimerInit()
    for $r = 1 To $N
    Dim $str1[3] = ['4:32', '10:01', '1:01']

    For $i = 0 To UBound($str1) - 1
    $str1[$i] = StringRegExpReplace($str1[$i], '\b\d:\d\d', 0 & '\0')
    Next

    Next

    [/autoit][autoit][/autoit][autoit]

    $EinsTime = TimerDiff($Zeit) / $N

    ;_ArrayDisplay($str, "RegExp")

    [/autoit][autoit][/autoit][autoit]

    $Zeit = TimerInit()
    for $r = 1 To $N
    Dim $str2[3] = ['4:32', '10:01', '1:01']

    For $i = 0 To UBound($str2) - 1
    $str2[$i] = StringFormat("%02u", $str2[$i]) & StringRight($str2[$i], 3)
    Next
    Next
    $ZweiTime = TimerDiff($Zeit) / $N

    ;_ArrayDisplay($str, "StringFormat")

    [/autoit][autoit][/autoit][autoit]

    $Zeit = TimerInit()
    for $r = 1 To $N
    Dim $str3[3] = ['4:32', '10:01', '1:01']

    For $i = 0 To UBound($str3) - 1
    $time = StringSplit($str3[$i], ":")
    If $time[0] <= 9 AND StringLen($time[0]) = 1 Then $time[0]="0"&$time[0]
    If $time[1] <= 9 AND StringLen($time[1]) = 1 Then $time[1]="0"&$time[1]
    $str3[$i] = $time[0]&":"&$time[1]
    Next
    Next
    $DreiTime = TimerDiff($Zeit) / $N

    ;_ArrayDisplay($str, "Leviathan")

    [/autoit][autoit][/autoit][autoit]

    $Zeit = TimerInit()
    for $r = 1 To $N
    Dim $str4[3] = ['4:32', '10:01', '1:01']

    For $i = 0 To UBound($str4) - 1
    If StringLen($str4[$i]) < 5 Then $str4[$i] = '0' & $str4[$i]
    Next
    Next
    $VierTime = TimerDiff($Zeit) / $N

    ;_ArrayDisplay($str, "StringLen")

    [/autoit][autoit][/autoit][autoit]

    $Zeit = TimerInit()
    for $r = 1 To $N
    Dim $str5[3] = ['4:32', '10:01', '1:01']

    For $i = 0 To UBound($str5) - 1
    If StringInStr($str5[$i], ':') = 2 Then $str5[$i] = '0' & $str5[$i]
    Next
    Next
    $FuenfTime = TimerDiff($Zeit) / $N

    ;_ArrayDisplay($str, "BugFix")

    [/autoit][autoit][/autoit][autoit]

    $Zeit = TimerInit()
    for $r = 1 To $N
    Dim $str6[3] = ['4:32', '10:01', '1:01']

    For $i = 0 To UBound($str6) - 1
    If $str6[$i] < 10 Then $str6[$i] = '0' & $str6[$i]
    Next
    Next
    $SechsTime = TimerDiff($Zeit) / $N

    ;_ArrayDisplay($str, "kleiner 10-Methode")

    [/autoit][autoit][/autoit][autoit][/autoit][autoit]

    $Zeit = TimerInit()
    for $r = 1 To $N
    Dim $str7[3] = ['4:32', '10:01', '1:01']

    For $i = 0 To UBound($str7) - 1
    $str7[$i] = StringRight('0' & $str7[$i],5)
    Next
    Next
    $SiebenTime = TimerDiff($Zeit) / $N

    [/autoit][autoit][/autoit][autoit]

    ;_ArrayDisplay($str, "Bernd")

    [/autoit][autoit][/autoit][autoit]

    MsgBox(0,"", "RegExp:" &@TAB&@TAB& Round($EinsTime, 3) & ' ms ' &@TAB&@TAB& $str1[0]&" "&$str1[1]&" "&$str1[2]& @CRLF & "StringFormat:" &@TAB& Round($ZweiTime, 3) & ' ms' &@TAB&@TAB&$str2[0]&" "&$str2[1]&" "&$str2[2]& @CRLF & "Leviathan:" &@TAB& Round($DreiTime, 3) & ' ms' &@TAB&@TAB&$str3[0]&" "&$str3[1]&" "&$str3[2]& @CRLF & "StringLen:" &@TAB& Round($VierTime, 3) & ' ms' &@TAB&@TAB&$str4[0]&" "&$str4[1]&" "&$str4[2]&@CRLF & "BugFix:" &@TAB&@TAB& Round($FuenfTime, 3) & ' ms' &@TAB&@TAB&$str5[0]&" "&$str5[1]&" "&$str5[2]& @CRLF & "<10-Methode:" &@TAB& Round($SechsTime, 3) & ' ms' &@TAB&@TAB&$str6[0]&" "&$str6[1]&" "&$str6[2]&@CRLF & "Bernd:" &@TAB&@TAB& Round($SiebenTime, 3) & ' ms'&@TAB&@TAB&$str7[0]&" "&$str7[1]&" "&$str7[2])

    [/autoit]

    MfG Schnuffel

    "Sarkasmus ist die niedrigste Form des Witzes, aber die höchste Form der Intelligenz."
    Val McDermid

    ein paar Infos ...

    Wer mehr als "nur" Hilfe benötigt, kann sich gern im Forum "Programmieranfragen" an uns wenden. Wir helfen in allen Fällen, die die Forenregeln zulassen.

    Für schnelle Hilfe benötigen wir ein ! lauffähiges ! Script, dass wir als Demonstration des Problems testen können. Wer von uns erwartet ein Teilscript erstmal lauffähig zu bekommen, der hat
    1. keine wirkliche Not
    2. keinen Respekt vor Menschen die ihm in ihrer Freizeit Ihre Hilfe anbieten
    3. oder ist einfach nur faul und meint wir coden das für ihn

    In solchen Fällen erlaube ich mir, die Anfrage einfach zu ignorieren. ;)